Microsoft Graph API访问令牌验证失败

时间:2016-06-16 13:03:36

标签: microsoft-graph

我使用此网址获取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 来查询图表(使用POST人) Graph API to query groups

我看到这篇文章InvalidAuthenticationToken and CompactToken issues - Microsoft Graph using PHP Curl但是毫无意义。

5 个答案:

答案 0 :(得分:4)

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

我还建议使用更容易使用的v2 Endpoint(特别是使用Graph)。我写了一个v2 Endpoint Primer来完成整个过程,也可能会有所帮助。

答案 1 :(得分:2)

您无法直接使用令牌,还有一个步骤可以将您从响应网址获取的代码更换为令牌。

这是我的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; 
       }

答案 2 :(得分:2)

今天,当我使用图API时遇到了这个问题,我的问题是我如何生成令牌。

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

GraphApi

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

答案 3 :(得分:1)

要接收访问令牌并将其用于配置文件请求,您不需要服务器端的任何内容,只需从客户端实现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 必需权限 登录用户查看用户的基本个人资料

答案 4 :(得分:0)

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

  1. app registration portal中注册您的应用。

  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&response_mode=query&scope=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

    Content-Type:应用程序/ x-www-form-urlencoded

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

    &scope = user.read%20mail.read

    &code = OAAABAAAAiL9Kn2Z27UubvWFPbm0gLWQJVzCTE9UkP3pSx1aXxUjq3n8b2JRLk4OxVXr ...

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

    &grant_type = authorization_code

    &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