- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
如何登录 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/
关闭。这个问题是off-topic .它目前不接受答案。 想改善这个问题吗? Update the question所以它是 on-topic对于堆栈溢出。 8年前关闭。 Improve this q
有什么方法可以以编程方式获取 Bing 背景图像吗? Bing的API似乎没有提供这样的功能,也许还有其他方法? 最佳答案 我认为最好的方法是通过 AJAX 调用来模仿他们自己的做法。 他们调用此 U
我正在开发一个带有必应 map 的网络应用程序。我使用这种方法来更改航点图钉图标: directionsManager.setRenderOptions({ itineraryCont
我正在尝试使用单独的信息框添加多个图钉。这意味着每个图钉都会有自己的信息框,其中包含自己的信息。里面有一个循环 latlng = new Microsoft.Maps.Location(latitud
如何通过 Ajax API 将多个图钉添加到 Bing map v7..? 它们可以从数组、列表、json 或其他任何地方加载。 有人可以提供一个小例子吗?谢谢 最佳答案 您可以使用EntityCol
我正在尝试将 3d 图像添加到 Bing map ,但是我的工作电脑没有互联网连接,我想知道如何在没有互联网可用的情况下向 Bing map 添加内容。有什么方法可以下载 bing map 示例,让我
我想使用 bing search api 来获取给定查询的搜索结果计数,但是,Bing API 似乎没有返回任何包含搜索结果计数的字段。 我应该指定一些选项来请求 URL 吗?或者 Bing API
我在网站上申请了 bingmaps ajax controll v7。我面前有一个任务:应用生产 URL。整个文档使用的引用 map :http://ecn.dev.virtualearth.net/
如何去掉 Bing map 顶部的导航栏?该栏有道路和自动选择器以及鸟瞰和空中选择器。 最佳答案 Microsoft.Maps.loadModule('Microsoft.Maps.Themes.Bi
如果您在同一地理位置有“伦敦”上的 2 个图钉,API 中是否有任何内容可以将它们分开以使它们都可见? 我只能找到有关具有 PreventIconCollisions 功能的旧 map 点 API 的
我有一个带有图钉和簇的 Bing map 。 我注意到此组合中存在性能问题和错误。我已经设置了一个 demo使用 official docs 中的代码. 第一个问题:缩放后 Pin 图点击处理程序不再
我想做的是通过 ajax API 显示以英国邮政编码为中心的小型 bing 生成 map 。我相信这是可能的;我在 Bing map 文档中找不到如何将英国邮政编码转换为可以插入 map Ajax 控
鉴于 Bing API 文档主要由一个错误缠身的两页 Word 文档组成,我无法在网上找到答案。反复试验产生了不一致的结果,考虑到查询需要花钱,我宁愿不再猜测和检查。 新的“Azure 市场”Bing
如何将“你在这里”标记添加到 Bing map 控件?在手机上,这表示为正方形内的圆圈,然后有一个外圆圈表示位置精度。 看起来你可以用图钉和 polgon 来做,但我希望有一种更简单/更好的方法 最佳
有人知道为什么普通 bing.com 和 bing api 2.2 的搜索结果不同吗? 例子: http://api.search.live.net/xml.aspx?Appid=yourid&que
鸟瞰图似乎在 V8 中不再可用。 谁能确认事实确实如此,或者在新版本中是否还有任何方法可以继续使用鸟瞰图? 微软关于这方面的文档很差,所以我只是把各种来源的信息拼凑在一起。 例如: 1. 在他们的 M
我正在使用 Microsoft.Maps API(AJAX control v. 7)。 我想显示地址的 pin。 当我使用: var loc = new Microsoft.Maps.Locatio
我找到了 link text对于 Google,但我想知道 Bing 是否有等价物? 最佳答案 谷歌搜索“bing static maps api”时的第二个链接... http://social.m
我想开始将 Bing 用于一个项目,其中包括计算点之间的最短路线,以及在 map 上绘制路线等。 但是,除了 Bing Maps,还有 VirtualEarth 和 MapPoint。所有这些产品如何
我已经 checkout their page on error handling但它所拥有的只是对请求可能返回的状态代码的描述。如果我超过每天允许的请求数量,bing 是否提供信息一将返回什么? 最
我是一名优秀的程序员,十分优秀!