所以我可以通过 OAuth2 登录到 Outlook 并让它为我的应用程序提供访问和刷新令牌。
但是,我似乎无法弄清楚如何让 Outlook OAuth2 使用提供的刷新令牌给我另一个令牌。我已经多次弄乱了这段代码,试图使用 C# HttpClient() 让某些东西正常工作。此外,我尝试按照这篇文章并使用“本机”“Experimental.IdentityModel.Clients.ActiveDirectory”库(这到底是什么?)来完成我的任务。
我可以使用这个库登录并获得访问代码,但它不会给我刷新令牌。这个特定的库似乎不提供对刷新令牌的访问,即使它们在响应中提供。
无论如何,这是我用来获取访问令牌的 HttpClient 代码(这是来自我的回调控制器方法):
string authCode = Request.Params["code"];
var client = new HttpClient();
var clientId = ConfigurationManager.AppSettings["ida:ClientID"];
var clientSecret = ConfigurationManager.AppSettings["ida:ClientSecret"];
var parameters = new Dictionary<string, string>
{
{"client_id", clientId},
{"client_secret", clientSecret},
{"code",authCode },
{"redirect_uri", Url.Action("Authorize", "Manage", null, Request.Url.Scheme)},
{"grant_type","authorization_code" }
};
var content = new FormUrlEncodedContent(parameters);
var response = await client.PostAsync("https://login.microsoftonline.com/common/oauth2/v2.0/token",content);
var tokens = await response.Content.ReadAsAsync<MicrosoftOAuthAuthenticationModel>();
var originalRefreshToken = tokens.refresh_token;
var originalAccessToken = tokens.access_token;
originalAccessToken 按预期生成。现在这是我无法弄清楚的部分:
var parameters2 = new Dictionary<string, string>
{
{"grant_type", "refresh_token"},
{"refresh_token", originalRefreshToken},
{"client_id", clientId},
{"client_secret", clientSecret},
{"resource","https://outlook.office365.com" }
};
var content2 = new FormUrlEncodedContent(parameters2);
var response2 = await client.PostAsync("https://login.microsoftonline.com/common/oauth2/token", content2);
var tokens2 = await response2.Content.ReadAsAsync<MicrosoftOAuthAuthenticationModel>();
var newRefreshtoken = tokens2.refresh_token;
var newAccessToken = tokens2.access_token;
我从服务器收到 400 错误,显示“身份验证失败:刷新令牌格式错误或无效”。这看起来很奇怪,因为我实际上是从响应中获取刷新令牌并使用它。
有没有人有任何可能有帮助的信息?或者,有谁知道该联系谁寻求帮助?最后,这里的目标是简单地能够通过 API 从 Office 365 的收件箱中持续读取电子邮件,以便我可以从电子邮件地址等获取电子邮件 ID、对话 ID、主题、内容并进行处理。有没有更简单的方法可以做到这一点?这不会是一件困难或不常见的事情。