繁体   English   中英

Microsoft Graph API 访问令牌验证失败

[英]Microsoft Graph API access token validation failure

我使用这个 URL 来获取 id_token:

https://login.microsoftonline.com/common/oauth2/authorize?
response_type=id_token%20code&
client_id=MY_CLIENT_GUID_ID_IN_HERE&
redirect_uri=http%3A%2F%2Flocalhost%3A3000%2Fauth%2Fopenid%2Freturn&nonce=alfaYYCTxBK8oypM&
state=6DnAi0%2FICAWaH14e

这个返回结果是这样的

http://localhost:3000/auth/openid/return?
code=AAA_code_in_here&
id_token=eyJ0eXAi_xxxx_yyyy_in_here&
state=6DnAi0%2FICAWaH14e&
session_state=xxxx_guid_xxxxx

然后我使用id_token来查询 Graph(使用 POST man) 用于查询组的图形 API

我已经看到这篇文章InvalidAuthenticationToken 和 CompactToken 问题 - Microsoft Graph using PHP Curl但没有意义。

OATH 2.0 需要多个步骤。 第一个请求返回一个 OAUTH 代码。 下一步是将该 OATUH 代码转换为承载令牌。 这是您在这里缺少的步骤。

我还建议使用v2 Endpoint ,它更容易使用(尤其是使用 Graph)。 我写了一个v2 Endpoint Primer来介绍整个过程,可能也会有所帮助。

您不能直接使用令牌,还有一个步骤可以将您从响应 url 获得的代码交换为令牌。

这是我的 C# 代码(使用 Microsoft.IdentityModel.Clients.ActiveDirectory)

      public static AuthenticationResult ExchangeCodeForToken(string InTenantName, string InUserObjId, string InRedirectUri, string InApplicationAzureClientID, string InApplicationAzureClientAppKey)
      {
                Check.Require(!string.IsNullOrEmpty(InTenantName), "InTenantName must be provided");
                Check.Require(!string.IsNullOrEmpty(InUserObjId), "InUserObjId must be provided");

                if (CanCompleteSignIn) //redirect from sign-in
                {
                    var clientCredential = new ClientCredential(InApplicationAzureClientID, InApplicationAzureClientAppKey);
                    var authContext = new AuthenticationContext(Globals.GetLoginAuthority(InTenantName), (TokenCache)new ADALTokenCache(InUserObjId)); //Login Authority is https://login.microsoftonline.com/TenantName
                    return authContext.AcquireTokenByAuthorizationCode(VerificationCode, new Uri(InRedirectUri), clientCredential, Globals.AZURE_GRAPH_API_RESOURCE_ID); //RESOURCE_ID is "https://graph.microsoft.com/"
                }

                return null; 
       }

我今天在玩图形 API 时遇到了这个问题,就我而言,问题是我如何生成令牌。

我使用邮递员生成令牌,其中 Auth URL 部分我添加了资源 = client_id 而它应该是图形 URL。 进行更改后,我可以通过邮递员拨打电话。

图形接口

为了使上述工作正常进行,请确保您在 Azure 中的应用程序已委派访问 Graph API 的权限。

要接收访问令牌并将其用于配置文件请求,您不需要来自服务器端的任何东西,您可以仅从客户端实现 oAuth2。

使用以下 URL 登录:

https://login.microsoftonline.com/common/oauth2/authorize?client_id=YOUR_CLIENT_ID&resource=https://graph.microsoft.com&response_type=token&redirect_uri=YOUR_REDIRECT_URI&scope=User.ReadBasic.All

登录成功后,用户将重定向到带有 access_token 参数的页面。 然后使用以下 AJAX 调用来获取用户信息:

 var token = login_window.location.href.split('access_token=').pop().split('&')[0]; $.ajax({ url: "https://graph.microsoft.com/v1.0/me", type: "GET", beforeSend: function(xhr){xhr.setRequestHeader('Authorization', 'Bearer '+token);}, success: function(data) { alert('Hi '+data.displayName); console.log(data); } });

请注意,您可能需要从 Azure Active Directory 应用程序清单文件启用oauth2AllowImplicitFlow:true设置。

将 "oauth2AllowImplicitFlow": false 设置为 "oauth2AllowImplicitFlow": true。

最后,确保您的应用程序具有Microsoft Graph所需的权限,即登录用户查看用户的基本配置文件

获取新应用程序访问权限的更新答案:

  1. 应用程序注册门户中注册您的应用程序

  2. 授权请求示例:

https://login.microsoftonline.com/{tenant}/oauth2/v2.0/authorize?client_id=6731de76-14a6-49ae-97bc-6eba6914391e&response_type=code&redirect_uri=http%3A%2F%2Flocalhost%2Fmyapp%2F offline_access%20user.read%20mail.read&state=12345

授权响应将如下所示:

https://localhost/myapp/?code=M0ab92efe-b6fd-df08-87dc-2c6500a7f84d&state=12345

  1. 获取令牌

    POST /{tenant}/oauth2/v2.0/token HTTP/1.1

    主机: https : //login.microsoftonline.com

    内容类型:应用程序/x-www-form-urlencoded

    client_id=6731de76-14a6-49ae-97bc-6eba6914391e

    &scope=user.read%20mail.read

    &code=OAAAABAAAAiL9Kn2Z27UubvWFPbm0gLWQJVzCTE9UkP3pSx1aXxUjq3n8b2JRLk4OxVXr...

    &redirect_uri=http%3A%2F%2Flocalhost%2Fmyapp%2F

    &grant_type=授权代码

    &client_secret=JqQX2PNo9bpM0uEihUPzyrh // 注意:仅 Web 应用程序需要

  2. 使用访问令牌调用 Microsoft Graph

    获取https://graph.microsoft.com/v1.0/me

    授权:承载 eyJ0eXAiO ... 0X2tnSQLEAnnSPHY0gKcgw

    主持人:graph.microsoft.com

来源:

https://docs.microsoft.com/en-us/graph/auth-v2-user?context=graph/api/1.0

您还可以在没有用户的情况下获取访问令牌,请参见此处:

https://docs.microsoft.com/en-us/graph/auth-v2-service

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM