Javascript Microsoft Graph API令牌验证失败
我会在我的Angular Web应用程序中使用Microsoft Graph API 首先,我使用 当我尝试使用profil登录时,会出现此错误 我已将我的应用程序配置为官方文件中提到的应用程序 身份验证正在工作,我得到了令牌 然后,当我在主页中时,我向Microsoft Graph API发出第二个请求,以使用该令牌获取用户信息Javascript Microsoft Graph API令牌验证失败,javascript,angular,azure-active-directory,microsoft-graph-api,msal,Javascript,Angular,Azure Active Directory,Microsoft Graph Api,Msal,我会在我的Angular Web应用程序中使用Microsoft Graph API 首先,我使用 当我尝试使用profil登录时,会出现此错误 我已将我的应用程序配置为官方文件中提到的应用程序 身份验证正在工作,我得到了令牌 然后,当我在主页中时,我向Microsoft Graph API发出第二个请求,以使用该令牌获取用户信息 getProfile() { let header= new Headers(); let tokenid= sessionStorage.getItem('
getProfile() {
let header= new Headers();
let tokenid= sessionStorage.getItem('msal.idtoken');
header.set('Authorization', 'Bearer ' + tokenid)
let url ="https://graph.microsoft.com/v1.0/me/"
return this.http.get(url,{headers:header});
}
}
我收到一个401未经授权的错误和一个响应:
{
"error": {
"code": "InvalidAuthenticationToken",
"message": "Access token validation failure.",
"innerError": {
"request-id": "xxxxxx",
"date": "2018-10-09T22:58:41"
}
}
}
我不知道为什么MG API不接受我的令牌,我是否使用了错误的权限url
更新:我了解到,实际上我得到的id_令牌与访问令牌不同。如何从MSAL库获取访问令牌以进行MS GRAPH API调用?:问题在于您使用的是id_令牌而不是访问令牌:
let-tokenid=sessionStorage.getItem('msal.idtoken')代码>
变得像:
let tokenid=sessionStorage.getItem('msal.token');//或msal.accesstoken
更新(根据菲利普的评论)
您需要选择要在应用程序中作为目标的作用域。因此,看起来您需要用户配置文件,因此您需要添加ApproveScopes属性以指定应用程序将使用的范围:
MsalModule.forRoot({
clientID: "Tenant ID",
authority: "https://login.microsoftonline.com/common/",
redirectUri: "http://localhost:4200/",
validateAuthority : true,
popUp: true,
consentScopes: ["user.read"]
}),
根据,您还可以附加一个HttpInterceptor,它将自动将访问令牌附加到每个(外部)HTTP调用
通过阅读文档,我发现了以下信息
同意范围:允许客户表达需要同意的范围。作用域可以来自多个资源/端点。在这里传递作用域只会同意它,并且在客户端实际调用API之前不会获取访问令牌。如果您仅将MSAL用于登录(身份验证),则此选项是可选的
这表明使用HttpInterceptor不仅附加访问令牌,而且还检索它。您看到的令牌可能只是应用程序的令牌,但不是Graph API的有效令牌
在内部,它使用getCachedTokenInternal(作用域:数组,用户:用户)
为特定作用域获取新的访问令牌。我不确定您是否也可以使用此方法为该资源获取新令牌。我只会使用拦截器
您可以尝试复制访问令牌,并查看它在(Microsoft提供的JWT令牌查看器)或上的外观
对图形有效的任何标记应具有https://graph.microsoft.com
,因此,如果检查令牌(在jwt.ms中),它至少应该具有此值
"aud": "https://graph.microsoft.com",
确保将端点添加到资源映射配置中。请参阅此链接:
这是你的问题。需要使用访问令牌。它不应该是,访问令牌应该是用于Microsoft Graph的令牌,ID令牌应该是用于您的应用程序的令牌。因此,使用Azure AD 2.0()的msal身份验证库不向MS Graph API提供访问令牌?它提供了,但您必须要求它,通过设置consetScopes
。但是如果aud=是唯一的值怎么办?这似乎不足以让Graph在访问SharePoint资源时感到高兴(尽管客户端已在应用程序注册中获得授权)。正在努力寻找为机密ClientApplication.acquireToken()指定某些实际作用域的示例anguler中不能有机密客户端,因为您不能对用户隐藏机密(或访问令牌)。如果aud中没有“”,我该怎么办?我也有一个后端API,这就是所列出的。要将“”列为aud,我需要添加什么?如果令牌的aud不是所需的值,则可能使用的是idenity令牌,而不是访问令牌。
"aud": "https://graph.microsoft.com",
export const protectedResourceMap:[string, string[]][]=[ ['https://graph.microsoft.com/v1.0/me', ['user.read']] ];