Azure AD 令牌端点不返回 access_token(只是一个 id_token 和一个 refresh_token)

man*_*uel 4 oauth-2.0 xamarin xamarin.auth azure-active-directory

我正在使用 Xamarin.Auth 在基于 Xamarin Forms 的移动应用程序中针对 Google 和 Azure AD 对用户进行身份验证。虽然 Google 一切正常,但我无法使用 Azure AD 获取 access_token:

  • 授权按预期工作,提供代码和状态
  • 令牌返回一个 id_token 和一个 refresh_token,但没有 access_token。

我可以在 Postman 中重播这个场景,所以这似乎不是由 Xamarin.Auth 引起的,更有可能归咎于我无法正确解释 Microsoft 的文档......

您的帮助将不胜感激!

在此处输入图片说明

Nan*_* Yu 6

在 Azure AD V2.0 中获取令牌时应包括资源范围。任何与 Azure AD 集成的 Web 托管资源都有一个资源标识符或应用程序 ID URI。例如,Microsoft Graph 是https://graph.microsoft.com.

如果您想获取 microsoft graph 的访问令牌,并有权读取登录用户的邮件,则令牌请求将是:

POST /{tenant}/oauth2/v2.0/token HTTP/1.1
Host: https://login.microsoftonline.com
Content-Type: application/x-www-form-urlencoded

client_id=6731de76-14a6-49ae-97bc-6eba6914391e
&scope=https%3A%2F%2Fgraph.microsoft.com%2Fmail.read
&code=OAAABAAAAiL9Kn2Z27UubvWFPbm0gLWQJVzCTE9UkP3pSx1aXxUjq3n8b2JRLk4OxVXr...
&redirect_uri=http%3A%2F%2Flocalhost%2Fmyapp%2F
&grant_type=authorization_code
&client_secret=JqQX2PNo9bpM0uEihUPzyrh    // NOTE: Only required for web apps
Run Code Online (Sandbox Code Playgroud)

请阅读此文档以了解 OAuth 2.0 授权代码流如何在 Azure AD V2.0 中工作。并单击此处了解 Azure Active Directory v2.0 端点中的范围、权限和同意

  • openid offline_access 是“OpenID Connect scopes”。请参阅[文档](https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-v2-scopes#openid-connect-scopes)。没有像“https:/”这样的资源范围/graph.microsoft.com/Fmail.read" ,openid connect 不会返回该资源的访问令牌,它只包含 id_token(show who you are) 。访问令牌用于访问受保护的资源。在 [Azure AD 令牌参考](https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-token-and-claims) 中查看更多详细信息 (2认同)