Microsoft Graph API令牌验证失败

inf*_*dev 5 javascript azure-active-directory microsoft-graph azure-ad-msal angular

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

首先,我使用msal库进行连接。 当我尝试使用配置文件登录时,出现此错误

我已经按照官方git示例中提到的配置了我的应用

MsalModule.forRoot({
  clientID: "Tenant ID",
  authority: "https://login.microsoftonline.com/common/",
  redirectUri: "http://localhost:4200/",
  validateAuthority : true,
  popUp: true
}),
Run Code Online (Sandbox Code Playgroud)

身份验证正在进行,我得到了令牌。

然后,当我进入主页时,我再次向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});
}
Run Code Online (Sandbox Code Playgroud)

}

我收到响应401 Unauthorized错误:

{
  "error": {
    "code": "InvalidAuthenticationToken",
    "message": "Access token validation failure.",
    "innerError": {
      "request-id": "xxxxxx",
      "date": "2018-10-09T22:58:41"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我不知道为什么MG API不接受我的令牌,我是否使用了错误的授权URL?

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

Ste*_*han 5

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

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

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

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

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

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

任何标记有效的图形应该有观众https://graph.microsoft.com,所以如果你检查令牌(在jwt.ms)至少应该有这个价值。

"aud": "https://graph.microsoft.com",
Run Code Online (Sandbox Code Playgroud)


Mic*_*ner 3

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

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

变成这样的东西:

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

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

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

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

  • 确实如此,但您必须通过设置“consetScopes”来要求它这样做。 (2认同)