Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Microsoft Graph API令牌验证失败_Javascript_Angular_Azure Active Directory_Microsoft Graph Api_Msal - Fatal编程技术网

Javascript 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('

我会在我的Angular Web应用程序中使用Microsoft Graph API

首先,我使用 当我尝试使用profil登录时,会出现此错误

我已将我的应用程序配置为官方文件中提到的应用程序

身份验证正在工作,我得到了令牌

然后,当我在主页中时,我向Microsoft Graph API发出第二个请求,以使用该令牌获取用户信息

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']] ];