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调用?:
根据同一个示例,您还可以附加一个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)
问题是您使用的是 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)
| 归档时间: |
|
| 查看次数: |
5946 次 |
| 最近记录: |