![](/img/trans.png)
[英]Microsoft Graph API: Access token validation failure. Invalid audience
[英]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)
我已经看到这篇文章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;
}
要接收访问令牌并将其用于配置文件请求,您不需要来自服务器端的任何东西,您可以仅从客户端实现 oAuth2。
使用以下 URL 登录:
登录成功后,用户将重定向到带有 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所需的权限,即登录用户和查看用户的基本配置文件
获取新应用程序访问权限的更新答案:
授权响应将如下所示:
https://localhost/myapp/?code=M0ab92efe-b6fd-df08-87dc-2c6500a7f84d&state=12345
获取令牌
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 应用程序需要
使用访问令牌调用 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
您还可以在没有用户的情况下获取访问令牌,请参见此处:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.