使用刷新令牌通过c#读取来自Office 365的电子邮件

本文关键字:Office 电子邮件 读取 刷新 令牌 | 更新日期: 2023-09-27 18:29:11

因此,我可以通过OAuth2登录到Outlook,并让它为我的应用程序提供访问和刷新令牌。

然而,我似乎不知道如何让OutlookOAuth2使用提供的刷新令牌给我另一个令牌。为了使用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、主题、内容并进行处理。有没有更简单的方法可以做到这一点?这不是一件困难或罕见的事情。

使用刷新令牌通过c#读取来自Office 365的电子邮件

如果使用ADAL库(Experimental.IdentityModel.Clients.ActiveDirectory),则不需要保存刷新令牌。库保存令牌,并根据需要管理刷新。您总是使用AcquireSilent...检索令牌(不记得确切的方法名称),它会尽可能地从缓存中提取,并在需要时刷新。

在你的代码中,你可能会看到这个问题,因为在刷新中你没有发布到v2端点。将你的端点URL更改为https://login.microsoftonline.com/common/oauth2/v2.0/token,看看这是否不能修复它。如果它仍然不起作用,你可以将http://oauthplay.azurewebsites.net/.