我使用此网址获取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
我看到这篇文章InvalidAuthenticationToken and CompactToken issues - Microsoft Graph using PHP Curl但是毫无意义。
答案 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。进行更改后,我可以通过邮递员拨打电话。
为使以上各项正常工作,请确保您在Azure中的应用程序已委派了访问Graph API的权限。
答案 3 :(得分:1)
要接收访问令牌并将其用于配置文件请求,您不需要服务器端的任何内容,只需从客户端实现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 的必需权限 登录用户和查看用户的基本个人资料强>
答案 4 :(得分:0)
获取新应用程序访问权限的更新答案:
在app registration portal中注册您的应用。
授权请求示例:
授权响应如下:
https:// localhost / myapp /?code = M0ab92efe-b6fd-df08-87dc-2c6500a7f84d&state = 12345
获取令牌
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应用程序必需
使用访问令牌调用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
您也可以在没有用户的情况下获得访问令牌,请参见此处: