Microsoft OAuth2 身份验证未返回刷新令牌
Microsoft OAuth2 Authentication Not Returning Refresh Token
我正在为我的雇主销售给其他公司的产品添加 Microsoft OneDrive 支持。当我完成设计和原型制作阶段时,我使用的是通过我使用个人帐户进行的应用程序注册获得的应用程序 ID。现在,我正在努力将代码实际添加到我们的产品中,并使用通过我们公司 Office365 帐户(由其他人)完成的应用程序注册获得的应用程序 ID。
我发现这两个应用程序注册的身份验证查询结果不同。我正在努力追查原因,希望这里有人可以提供帮助。
当我使用我的个人帐户注册时,我收到了 Microsoft 在线文档中记录的 /token
url 中的所有数据项。当我切换到使用我们公司帐户的注册时,除了应用程序 ID 外,代码中没有任何更改,我没有得到 refresh_token
值。我在两个测试中使用了相同的登录凭据。
以下是使用我的个人注册时的信息:
Url: 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"
}
以下是使用我们公司注册时的信息:
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_id
和code
的值外,唯一不同的是应用程序注册(一个使用个人帐户,另一个使用公司Office365帐户)。这可能是什么原因造成的?通过我们的公司帐户注册是否缺少某些内容?
我没有查看公司注册的权限,所以我无法将他们的内容与我个人注册中的内容进行比较。我给了他们所有相关信息,但我不知道他们是否按我的要求做了。
Microsoft 文档非常不清楚。他们的在线服务经历了多次迭代,这导致了相当多的残留数据。当我从 Office365 中撤销对这两个应用程序的访问权限并从头开始对它们进行身份验证时,这两个调用都没有 /token
调用的响应中的 refresh_token
值。
我设法将 Microsoft 和 OpenID 文档中的各个部分放在一起以找到答案。在初始授权请求中,调用 https://login.microsoftonline.com/common/oauth2/v2.0/authorize
、将 offline_access
添加到 scope
查询字符串参数解决了该问题。
在应用程序注册端无需添加或更改任何内容。添加此新范围后,还将向用户显示该应用程序正在请求离线访问数据。这一系列步骤打开 refresh_token
值的 return。为什么它一开始就在那里,没有具体说明 offline_access
仍然是个谜。
2019更新
首先,感谢 ke4ktz(已接受的答案),工作完美。
但是,我最初不知道如何将 offline_access 添加到范围 :) 所以如果有人有同样的问题,您只需在范围字符串后添加 space 所以让我们假设你的范围是 "Sites.FullControl.All" 那么现在它将是 "offline_access Sites.FullControl.All".
可以找到微软的参考here
希望对你有帮助
我正在为我的雇主销售给其他公司的产品添加 Microsoft OneDrive 支持。当我完成设计和原型制作阶段时,我使用的是通过我使用个人帐户进行的应用程序注册获得的应用程序 ID。现在,我正在努力将代码实际添加到我们的产品中,并使用通过我们公司 Office365 帐户(由其他人)完成的应用程序注册获得的应用程序 ID。
我发现这两个应用程序注册的身份验证查询结果不同。我正在努力追查原因,希望这里有人可以提供帮助。
当我使用我的个人帐户注册时,我收到了 Microsoft 在线文档中记录的 /token
url 中的所有数据项。当我切换到使用我们公司帐户的注册时,除了应用程序 ID 外,代码中没有任何更改,我没有得到 refresh_token
值。我在两个测试中使用了相同的登录凭据。
以下是使用我的个人注册时的信息:
Url: 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"
}
以下是使用我们公司注册时的信息:
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_id
和code
的值外,唯一不同的是应用程序注册(一个使用个人帐户,另一个使用公司Office365帐户)。这可能是什么原因造成的?通过我们的公司帐户注册是否缺少某些内容?
我没有查看公司注册的权限,所以我无法将他们的内容与我个人注册中的内容进行比较。我给了他们所有相关信息,但我不知道他们是否按我的要求做了。
Microsoft 文档非常不清楚。他们的在线服务经历了多次迭代,这导致了相当多的残留数据。当我从 Office365 中撤销对这两个应用程序的访问权限并从头开始对它们进行身份验证时,这两个调用都没有 /token
调用的响应中的 refresh_token
值。
我设法将 Microsoft 和 OpenID 文档中的各个部分放在一起以找到答案。在初始授权请求中,调用 https://login.microsoftonline.com/common/oauth2/v2.0/authorize
、将 offline_access
添加到 scope
查询字符串参数解决了该问题。
在应用程序注册端无需添加或更改任何内容。添加此新范围后,还将向用户显示该应用程序正在请求离线访问数据。这一系列步骤打开 refresh_token
值的 return。为什么它一开始就在那里,没有具体说明 offline_access
仍然是个谜。
2019更新
首先,感谢 ke4ktz(已接受的答案),工作完美。
但是,我最初不知道如何将 offline_access 添加到范围 :) 所以如果有人有同样的问题,您只需在范围字符串后添加 space 所以让我们假设你的范围是 "Sites.FullControl.All" 那么现在它将是 "offline_access Sites.FullControl.All".
可以找到微软的参考here
希望对你有帮助