这是桌面应用程序的一部分。
基于https://docs.microsoft.com/en-us/bingwebmaster/oauth2
以下用于交换访问和刷新令牌的授权代码的代码在几个月前开始工作......
try
{
HttpWebRequest req = WebRequest.CreateHttp("https://www.bing.com/webmasters/oauth/token");
req.Method = WebRequestMethods.Http.Post;
req.ContentType = "application/x-www-form-urlencoded";
StringBuilder content = new StringBuilder();
content.AppendFormat("code={0}&", Uri.EscapeDataString(code));
content.AppendFormat("client_id={0}&", Uri.EscapeDataString(clientId));
content.AppendFormat("client_secret={0}&", Uri.EscapeDataString(clientSecret));
content.AppendFormat("redirect_uri={0}&", Uri.EscapeDataString(redirectUri));
content.AppendFormat("grant_type={0}", Uri.EscapeDataString("authorization_code"));
var data = Encoding.ASCII.GetBytes(content.ToString());
using (var stream = await req.GetRequestStreamAsync())
{
await stream.WriteAsync(data, 0, data.Length);
}
string json;
using (var res = await req.GetResponseAsync())
{
using (var stream = res.GetResponseStream())
using (var sr = new StreamReader(stream))
{
json = await sr.ReadToEndAsync();
}
}
if (!string.IsNullOrWhiteSpace(json))
{
tokenResponse = JsonConvert.DeserializeObject<TokenResponse>(json);
}
}
catch (WebException wex)
{
using (var stream = wex.Response.GetResponseStream())
using (var sr = new StreamReader(stream))
{
var t = await sr.ReadToEndAsync();
}
}
catch (Exception ex)
{
}
然而,await req.GetResponseAsync()
现在回归
400 Bad Request、Origin 和 Referer 请求标头均不存在/为空
我尝试添加req.Referer = redirectUri;
然后它返回
400 错误请求,无法提取预期的防伪令牌
我尝试将随机state
参数传递给授权端点,并在回调中收到相同的参数。我已将其包含在令牌交换中,也将其排除在令牌交换之外,而上述结果没有变化。
我不是 OAuth 专家,但我已经完成了一些集成,而且我以前从未见过这种情况。
用户通过带有 WebView2 控件的窗口授予授权,该控件返回代码。这部分仍然运作良好。我在响应中快速浏览了一下是否有任何与防伪/CSRF 相关的内容从服务器返回,但我没有注意到任何东西。无论如何,关于请求令牌所需的文档并没有改变,所以此时一切基本上都是反复试验。
所以我的问题是,如果你在任何 OAuth 实现中看到了这个引用/防伪问题,你是如何修复它或解决它的?或者,如果您使用的是 Bing 网站管理员工具 API 解决方案(自定义或其他),它是否仍然有效?
除此之外,我对想法持开放态度,我很感激你的时间。