Microsoft Graph API令牌验证失败

时间:2018-10-09 23:16:29

标签: javascript angular azure-active-directory microsoft-graph msal

我将在Angular Web应用程序中使用Microsoft Graph API。

首先,我使用msal library建立连接 当我尝试使用个人资料登录时,出现此错误

我已经按照官方git sample

中的说明配置了我的应用
MsalModule.forRoot({
  clientID: "Tenant ID",
  authority: "https://login.microsoftonline.com/common/",
  redirectUri: "http://localhost:4200/",
  validateAuthority : true,
  popUp: true
}),

认证工作正常,我得到了令牌。

然后,当我进入主页时,我再次向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不接受我的令牌,我使用的授权网址是否错误?

更新:我了解到,实际上我得到的id_token与访问令牌不同。如何从MSAL库获取Access令牌以进行MS GRAPH API调用?:

3 个答案:

答案 0 :(得分:1)

问题是您使用的是id_token而不是访问令牌:

let tokenid= sessionStorage.getItem('msal.idtoken');

变成类似这样的东西:

let tokenid= sessionStorage.getItem('msal.token'); // or msal.accesstoken

更新(根据菲利普的评论)

您需要选择要在应用程序中定位的范围。因此,您似乎需要用户配置文件,因此您将需要添加同意范围属性以指定您的应用将使用哪些范围:

MsalModule.forRoot({
  clientID: "Tenant ID",
  authority: "https://login.microsoftonline.com/common/",
  redirectUri: "http://localhost:4200/",
  validateAuthority : true,
  popUp: true,
  consentScopes: ["user.read"]
}),

答案 1 :(得分:1)

根据the same sample,您还可以附加 HttpInterceptor ,它将自动将访问令牌附加到每个(外部)HTTP调用。

通过阅读文档,我发现了以下信息。

  

consentScopes::允许客户表达所需的期望范围。范围可以来自多个资源/端点。在此处传递范围仅表示同意,并且在客户端实际调用API之前不会获取访问令牌。如果您仅将MSAL用于登录(身份验证),则这是可选的。

这表明使用 HttpInterceptor 不仅会附加访问令牌,还会检索它。您看到的令牌可能只是应用程序的令牌,但不是Graph API的有效令牌。

在内部,它使用getCachedTokenInternal(scopes: Array<string>, user: User)获取针对特定范围code found here的新访问令牌。我不确定您是否也可以使用此方法来获取该资源的新令牌。我只会使用拦截器。

您可以尝试复制访问令牌,并在jwt.ms(Microsoft提供的JWT令牌查看器)或jwt.io上查看访问令牌的外观。

对Graph有效的任何令牌都应具有https://graph.microsoft.com Audience ,因此,如果您检查令牌(在jwt.ms中),则至少应具有此值。

"aud": "https://graph.microsoft.com",

答案 2 :(得分:0)

确保将端点添加到资源映射配置。查看此链接:https://github.com/AzureAD/microsoft-authentication-library-for-js/tree/dev/samples/MSALAngularDemoApp

export const protectedResourceMap:[string, string[]][]=[ ['https://graph.microsoft.com/v1.0/me', ['user.read']] ];