gpt4 book ai didi

c# - 仅使用 .NET 的 Bing Ads OAuth 自动化?

转载 作者:太空狗 更新时间:2023-10-29 22:30:58 25 4
gpt4 key购买 nike

如何登录 Microsoft Live(使用 .NET WebClient?)并自动执行 OAuth 流程以获取 token 以进行 Bing Ads API 调用?

我的问题类似于How do I get an OAuth request_token from live.com? .但是,我正在使用链接到多个其他 Bing Ads 帐户的 Bing Ads super 管理员帐户的上下文构建(C#、.NET 4.5.2) headless Windows 服务。这个想法是进行身份验证,获取身份验证位,然后在凌晨 3:00 使用这些位进行调用。一些帐户“竞争”,例如 A 组不应该看到 B 组的数据,因此让应用程序为每个人获取数据并过滤并在一夜之间分发可以解决许多业务问题。

我担心如果 Live 遇到问题,或者我们的应用程序因任何原因长时间停机,我们将不得不手动重新验证以再次获取数据。凭据的维护和管理现在是额外的开销(这是针对企业环境的),必须采用内联网网站/页面的形式,以允许初级/未启动的人员在需要时完成工作(不要忘记测试和文档)。相比之下,谷歌为需要以全自动方式工作的组提供了使用 key 对的选项。 Twitter 的 OAuth2 实现似乎可以在没有 GUI 登录的情况下实现自动化。其他 Bing 服务(例如 Translation)似乎也可以通过 WebClient 实现自动化。

我已经有了 Microsoft 帐户名和密码,并且在 Bing Ads 应用 GUI 中设置了“local-mydomain.com”的回调 URL(并且有一个 local-mydomain.com 的 HOSTS 条目)。

微软sample似乎有效,但它使 MS Web 浏览器控件自动化,期望用户在 GUI 中输入凭据,然后给出 token 。将 super 管理员帐户授予用户来执行此操作不是一种选择。期望用户在凌晨 3:00 起床以进行身份​​验证以上传/下载数据不是一种选择。期望用户获得对场中服务器的桌面访问权限以“运行某些东西”不是一种选择。

感谢所有 OAuth 想法。

谢谢。

这是启动代码:

 partial class OAuthForm : Form
{
private static OAuthForm _form;
private static WebBrowser _browser;

private static string _code;
private static string _error;

// When you register your application, the Client ID is provisioned.

private const string ClientId = "000redacted000";

// Request-related URIs that you use to get an authorization code,
// access token, and refresh token.

private const string AuthorizeUri = "https://login.live.com/oauth20_authorize.srf";
private const string TokenUri = "https://login.live.com/oauth20_token.srf";
private const string DesktopUri = "https://login.live.com/oauth20_desktop.srf";
private const string RedirectPath = "/oauth20_desktop.srf";
private const string ConsentUriFormatter = "{0}?client_id={1}&scope=bingads.manage&response_type=code&redirect_uri={2}";
private const string AccessUriFormatter = "{0}?client_id={1}&code={2}&grant_type=authorization_code&redirect_uri={3}";
private const string RefreshUriFormatter = "{0}?client_id={1}&grant_type=refresh_token&redirect_uri={2}&refresh_token={3}";

// Constructor

public OAuthForm(string uri)
{
InitializeForm(uri);
}

[STAThread]
static void Main()
{
// Create the URI to get user consent. Returns the authorization
// code that is used to get an access token and refresh token.

var uri = string.Format(ConsentUriFormatter, AuthorizeUri, ClientId, DesktopUri);

_form = new OAuthForm(uri);

// The value for "uri" is
// https://login.live.com/oauth20_authorize.srf?client_id=000redacted000&scope=bingads.manage&response_type=code&redirect_uri=https://login.live.com/oauth20_desktop.srf



_form.FormClosing += form_FormClosing;
_form.Size = new Size(420, 580);

Application.EnableVisualStyles();

// Launch the form and make an initial request for user consent.
// For example POST /oauth20_authorize.srf?
// client_id=<ClientId>
// &scope=bingads.manage
// &response_type=code
// &redirect_uri=https://login.live.com/oauth20_desktop.srf HTTP/1.1

Application.Run(_form); // <!---------- Problem is here.
// I do not want a web browser window to show,
// I need to automate the part of the process where
// a user enters their name/password and are
// redirected.

// While the application is running, browser_Navigated filters traffic to identify
// the redirect URI. The redirect's query string will contain either the authorization
// code if the user consented or an error if the user declined.
// For example https://login.live.com/oauth20_desktop.srf?code=<code>



// If the user did not give consent or the application was
// not registered, the authorization code will be null.

if (string.IsNullOrEmpty(_code))
{
Console.WriteLine(_error);
return;
}

最佳答案

无论您做什么,“ super 管理员”都必须使用浏览器至少登录一次。您可以通过在您的服务中托管一个简单的网页来实现这一点,或者您可以将其作为设置过程的一部分来实现。 Live 示例向您展示了如何做到这一点。

“ super 管理员”使用代码授权登录后,您将收到一个访问 token 和一个刷新 token 。我不确定实时访问 token 的有效期有多长,但它可能足以进行一晚运行。将刷新 token 保存在安全的地方。第二天晚上,您首先用新的访问 token 和新的刷新 token 交换该刷新 token 。同样,您为第二天晚上保存这个新的刷新 token 。

只要“ super 管理员”不撤销他对您的应用的授权,您就可以让这个过程永远运行。

更新:

一些 OAuth 2.0 服务器支持“资源所有者密码凭证授予”,请参阅 RFC https://www.rfc-editor.org/rfc/rfc6749 .如果 Live 服务器支持,它将成为不需要浏览器的 Code Grant 的替代方案。然而,即使服务器支持它,出于安全原因我还是建议不要使用它,因为它需要在服务器上存储您的“ super 管理员”密码。如果有人获取了密码,他们就可以完全访问该帐户以及受其保护的所有资源。如果您更改密码,它也会崩溃。代码授权不存在这些问题。

你的问题表明你想要或需要以这个“ super 管理员”的身份运行。另一种选择可能是使用“Client Credentials Grant”。但是,这也需要将客户端 secret 存储在服务器上(与密码凭据授予一样)。此外,它仍然需要 super 管理员对客户端进行授权,而这本身就需要使用浏览器进行代码授权。

您问为什么代码授予需要浏览器,为什么不能使用某种屏幕抓取来模拟浏览器交互。首先,您无法预测将显示给用户的屏幕。这些屏幕更改恕不另行通知。更重要的是,根据用户选项和历史记录,服务器会显示不同的屏幕。例如,用户可能已开启双因素身份验证。最后但同样重要的是,您为什么反对打开浏览器?它可能比尝试模仿它更容易。

最后,这些“ super 管理员”用户可能会反对将他们的密码提供给您的应用程序,因为他们真的不知道您在用它做什么(就他们而言,您可能正在向自己的服务器发送密码知道)。在浏览器中使用 Code Grant,他们知道您的应用程序永远不会看到他们的密码(有点——您可以监听浏览器事件或其他东西,除非浏览器控件在不受您控制的单独进程中运行,例如Windows 8 WebAuthenticationBroker)。您的应用程序只会获得一个具有他们授权范围的 token 。

关于c# - 仅使用 .NET 的 Bing Ads OAuth 自动化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25751199/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com