微软OAuth2认证没有返回刷新令牌

21
我正在为我们公司销售给其他公司的产品添加 Microsoft OneDrive 支持。在设计和原型制作阶段,我使用了通过个人账户进行的应用程序注册获得的应用程序 ID。现在,我正在实际将代码添加到我们的产品中,并且正在使用通过我们公司 Office365 账户(由他人)进行的应用程序注册获得的应用程序 ID。
我在这两个应用程序注册之间的身份验证查询结果有所不同。我正在尝试跟踪原因,希望有人能在这里提供帮助。
当我使用个人账户中的注册时,我从 Microsoft 在线文档中记录的/token URL 中接收到所有数据项。但是当我切换到使用我们企业账户中的注册(除了应用程序 ID 以外没有改变代码),我就无法获得refresh_token值。我对于这两个测试都使用了相同的登录凭据。
以下是在使用我的个人应用程序注册时的信息:
Url: https://login.microsoftonline.com/common/oauth2/v2.0/token Request Body: grant_type=authorization_code&client_id={XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}&code=XXXXXXXXXXXXXX...XXXXXXXXXXXXXXXX Request Response:
{
  "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"
}

使用我们的企业注册信息时,以下是相关信息:

URL: 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 帐户)。这可能是什么原因?我们通过公司账户注册时有什么遗漏吗?我没有权限查看公司注册信息,因此无法比较他们提交的与我的个人注册信息有何不同。我将所有相关信息都提供给了他们,但我不知道他们是否按照我的要求做了一切。

2个回答

69
微软文档内容不太清晰。在线服务经历了多次迭代,这会导致相当多的残留数据。当我在Office365内部撤销应用程序的访问权限并从头重新验证这两个应用程序时,两个调用都没有在/token调用的响应中包含refresh_token值。
我成功地从微软和OpenID文档中汇集了信息以找到答案。在初始授权请求中,调用https://login.microsoftonline.com/common/oauth2/v2.0/authorize,将offline_access添加到scope查询字符串参数中,即可解决此问题。
在应用程序注册方面无需添加或更改任何内容。当添加此新范围时,用户还将看到该应用程序正在请求离线数据访问权限。这些步骤的顺序打开了refresh_token值的返回。为什么还没有指定offline_access,它就一开始存在于响应中,仍然是一个谜。

1
我添加了 offline_access 权限,并且返回结果包括了 refresh_token,非常感谢,让我开心不已! - Heider Sati
我正在尝试使用Calendars.ReadWrite做同样的事情,但它不起作用。有没有其他方法可以做到这一点? - Guy Biber
救命恩人。如果官方文档没有提到这个问题,我可能会浪费几个小时。非常感谢。 - VijayRana
谢谢,伙计...我已经苦恼了6个小时的文档了 - 你是我的救星。 - Jason Rietzke
这个问题还存在,添加offline_access对我也有效。谢谢! - undefined
显示剩余2条评论

12

2019年更新

首先,感谢ke4ktz(被采纳的答案),它完美地解决了问题。

然而,刚开始我不知道如何在范围内添加offline_access :) 所以如果有人遇到同样的问题,只需在您的范围字符串后面添加一个空格,比如你的范围是"Sites.FullControl.All",现在它将是"offline_access Sites.FullControl.All"。

Microsoft的参考资料可以在这里找到。

希望这能有所帮助


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接