【问题标题】:Microsoft OAuth2 Authentication Not Returning Refresh TokenMicrosoft OAuth2 身份验证不返回刷新令牌
【发布时间】:2019-11-12 23:20:36
【问题描述】:

我正在为我的雇主向其他公司销售的产品添加 Microsoft OneDrive 支持。当我完成设计和原型制作阶段时,我使用的应用程序 ID 是通过我使用个人帐户进行的应用程序注册获得的。现在,我正在努力将代码实际添加到我们的产品中,并使用通过(由其他人)通过我们的公司 Office365 帐户完成的应用程序注册获得的应用程序 ID。

我发现这两个应用程序注册之间的身份验证查询结果有所不同。我正在努力追查原因,希望这里有人能提供帮助。

当我从我的个人帐户使用注册时,我收到了来自 Microsoft 在线文档中记录的 /token url 的所有数据项。当我切换到使用我们公司帐户的注册时,除了应用程序 ID 之外没有更改代码中的任何内容,我没有得到 refresh_token 值。我在两个测试中使用了相同的登录凭据。

以下是使用我的个人注册时的信息:

网址:https://login.microsoftonline.com/common/oauth2/v2.0/token

请求正文:grant_type=authorization_code&client_id={XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}&code=XXXXXXXXXXXXXX...XXXXXXXXXXXXXXXX

请求响应:

{
  "token_type":"Bearer",
  "scope":"https://graph.microsoft.com/files.readwrite.all",
  "expires_in":3599,
  "ext_expires_in":0,
  "access_token":"XXXXXXXXXXXXXX...XXXXXXXXXXXXXXXX",
  "refresh_token":"XXXXXXXXXXXXXX...XXXXXXXXXXXXXXXX"
}

以下是使用我们公司注册时的信息:

网址:https://login.microsoftonline.com/common/oauth2/v2.0/token

请求正文:grant_type=authorization_code&client_id={YYYYYYYY-YYYY-YYYY-YYYY-YYYYYYYYYYYY}&code=YYYYYYYYYYYYYY...YYYYYYYYYYYYYYY

请求响应:

{
  "token_type":"Bearer",
  "scope":"https://graph.microsoft.com/files.readwrite.all",
  "expires_in":3599,
  "ext_expires_in":0,
  "access_token":"YYYYYYYYYYYYYY...YYYYYYYYYYYYYYY"
}

除了client_idcode 的值之外,唯一不同的是应用程序注册(一个使用个人帐户,另一个使用公司Office365 帐户)。这可能是什么原因?通过我们的公司帐户注册是否缺少某些内容?

我没有查看公司注册的权限,因此我无法将他们提供的内容与我在个人注册中的内容进行比较。我向他们提供了所有相关信息,但我不知道他们是否按照我的要求做了。

【问题讨论】:

    标签: oauth-2.0 onedrive


    【解决方案1】:

    Microsoft 文档非常不清楚。他们的在线服务经历了多次迭代,这导致了相当多的残留数据。当我从 Office365 中撤消对这两个应用程序的访问权限并从头开始重新对它们进行身份验证时,这两个调用都缺少来自 /token 调用的响应中的 refresh_token 值。

    我设法将 Microsoft 和 OpenID 文档中的部分拼凑起来以找到答案。在初始授权请求中,调用https://login.microsoftonline.com/common/oauth2/v2.0/authorize,将offline_access 添加到scope 查询字符串参数解决了该问题。

    在应用注册方面无需添加或更改任何内容。添加此新范围后,还将向用户显示应用程序正在请求离线访问数据。这一系列步骤打开了refresh_token 值的返回。为什么它首先存在,但没有指定 offline_access 仍然是一个谜。

    【讨论】:

    • 我添加了offline_access,返回结果包括refresh_token,感谢一百万,让我开心!
    • 我正在尝试对 Calendars.ReadWrite 做同样的事情,但它不起作用。有没有其他方法可以做到这一点?
    • 感谢您的信息,文档现在处于糟糕的状态
    • 救世主。我可能会浪费几个小时,因为官方文档不包含任何关于它的内容。非常感谢您
    • 我在这上面浪费了几个小时。浏览完微软文档后,我认为获取 refresh_token 的唯一方法是使用 {tenant} url。但这有效
    【解决方案2】:

    2019 年更新

    首先,感谢 ke4ktz(已接受的答案),完美运行。

    但是,我最初不知道如何将 offline_access 添加到范围 :) 所以如果有人有同样的问题,你只需在你的范围字符串后面加上空格,假设你的范围是“Sites.FullControl.All " 所以现在它将是 "offline_access Sites.FullControl.All"。

    来自微软的参考可以在here找到

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 2019-03-14
      • 2017-11-08
      • 2020-01-16
      • 2015-01-08
      • 1970-01-01
      • 1970-01-01
      • 2020-07-07
      • 2020-03-24
      • 2016-07-18
      相关资源
      最近更新 更多