我正在向我的雇主向其他公司销售的产品添加 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_id
和code
的值外,唯一不同的是申请注册(一个使用个人帐户,另一个使用企业Office365帐户)。 这可能是什么原因造成的? 通过我们的公司帐户注册是否缺少某些内容?
我没有查看公司注册信息的权限,因此我无法将他们提供的内容与我个人注册信息中的内容进行比较。 我向他们提供了所有相关信息,但我不知道他们是否按照我的要求做了。
微软的文档相当不清楚。 他们的在线服务经历了多次迭代,这导致了相当多的残留数据。 当我从 Office365 内撤销对这两个应用程序的访问权限并从头开始重新验证这两个应用程序时,这两个调用在
refresh_token
调用的响应中都没有 /token
值。
我设法将 Microsoft 和 OpenID 文档中的各个部分放在一起来找到答案。 在初始授权请求中,调用
https://login.microsoftonline.com/common/oauth2/v2.0/authorize
,将 offline_access
添加到 scope
查询字符串参数解决了该问题。
应用程序注册端无需添加或更改任何内容。 添加此新范围后,还将向用户显示应用程序正在请求离线访问数据。 这一系列步骤将开启
refresh_token
值的返回。 为什么它一开始就在那里,没有具体说明offline_access
仍然是个谜。
2019更新
首先,感谢 ke4ktz (已接受的答案),工作完美。
但是,我最初不知道如何将离线访问添加到范围:)所以如果有人遇到同样的问题,您只需在范围字符串后面添加空格即可,所以假设您的范围是“Sites.FullControl.All”,所以现在它将是“offline_access Sites.FullControl.All”。
可以在这里
找到微软的参考资料希望对你有帮助
我可以通过电报联系您吗?如果可以的话,可以给我你的链接吗?