Oauth 2.0 Microsoft OAuth2身份验证未返回刷新令牌

Oauth 2.0 Microsoft OAuth2身份验证未返回刷新令牌,oauth-2.0,onedrive,Oauth 2.0,Onedrive,我正在将Microsoft OneDrive支持添加到我的雇主向其他公司销售的产品中。当我完成设计和原型设计阶段时,我使用的是waw通过我使用个人帐户进行的应用程序注册获得的应用程序ID。现在,我正致力于将代码添加到我们的产品中,并使用通过我们的公司Office365帐户(由其他人)进行的应用程序注册获得的应用程序ID 我发现这两个应用程序注册之间的身份验证查询结果存在差异。我正在努力寻找原因,希望这里有人能帮上忙 当我从我的个人帐户使用注册时,我收到了Microsoft online文档中记录

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

我发现这两个应用程序注册之间的身份验证查询结果存在差异。我正在努力寻找原因,希望这里有人能帮上忙

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

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

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

请求主体:
grant\u type=authorization\u code&client\u id={XXXXXXXX-XXXX-XXXX-XXXXXXXX-XXXXXXXXXXXX}&code=XXXXXXXXXXXXXXXXX…XXXXXXXXXXXXXXXXXX

请求-响应:

{
  "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\u type=authorization\u code&client\u id={yyyyyyyyyyy-yyyyy-yyyyyyyyyyyyyyyyyyyyyyyy}&code=yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy

请求-响应:

{
  "token_type":"Bearer",
  "scope":"https://graph.microsoft.com/files.readwrite.all",
  "expires_in":3599,
  "ext_expires_in":0,
  "access_token":"YYYYYYYYYYYYYY...YYYYYYYYYYYYYYY"
}
除了
客户id
code
的值之外,唯一不同的是应用程序注册(一个使用个人帐户,另一个使用公司Office365帐户)。这可能是什么原因?通过我们的公司账户注册时有什么遗漏吗


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

微软的文档非常不清楚。他们的在线服务经历了多次迭代,这导致了大量剩余数据的存在。当我从Office365中撤销对这两个应用程序的访问并从头开始重新验证这两个应用程序时,这两个调用都缺少
/token
调用响应中的
刷新\u token

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


不需要在应用程序注册端添加或更改任何内容。添加此新作用域后,用户还将看到应用程序正在请求脱机访问数据。此步骤序列打开
刷新\u标记的返回。为什么它在没有指定离线访问的情况下首先出现在那里仍然是个谜。

2019年更新

首先,感谢ke4ktz(公认的答案),它工作得非常完美

但是,我一开始不知道如何将脱机访问添加到作用域:)因此,如果有人有相同的问题,您只需在作用域字符串后添加它,并用空格表示,您的作用域是“Sites.FullControl.All”,因此现在它将是“脱机访问Sites.FullControl.All”

可以找到来自Microsoft的参考


我希望这会有所帮助

我添加了离线访问,返回的结果包括刷新令牌,万分感谢,让我开心!我正在尝试对Calendars.ReadWrite执行同样的操作,但它不起作用。有没有其他方法可以做到这一点?谢谢你提供的信息,文档现在处于一种可怕的状态Life Saviour。我可能会浪费几个小时,因为官方文件中没有任何相关内容。非常感谢我为此浪费了几个小时。在浏览了microsoft文档之后,我认为获得refresh_令牌的唯一方法是使用{tenant}url。但这是有效的