我正在尝试将Azure AD登录和Graph API集成到我的angular2网站。
我已经成功实施了一个ADAL登录和重定向,围绕一个有用的博客帖子here
从这里我检索了我的adalservice可以访问的id_token参数。目前,这是通过简单的context.login()
实现并在重定向中捕获令牌。
当我使用此令牌尝试访问Microsoft Graph时,收到InvalidAuthenticationToken
响应,声明Access Token validation failure
。
我对这些东西不熟悉,所以可能是我的电话本质上是错误的,或者我在AD中缺少某些权限,或者我的app reg缺少权限。我已经看到我可能需要请求具有足够范围的访问令牌,但我可以找到这方面的任何示例。
是否有人使用此adalService库获取用于Graph API的令牌?
答案 0 :(得分:3)
我找到了解决问题的方法。
我使用了错误的令牌。我必须专门为Graph API获取一个令牌。这意味着我必须首先登录,然后如下所示调用this.context.acquireToken()
:
this.context.acquireToken("https://graph.microsoft.com", function (error, id_token) {
if (error || !id_token) {
console.log('ADAL error occurred: ' + error);
}
else {
this.graphAccessToken = id_token;
//Call graph API
}
}.bind(this)
);
这个过程有2个电话似乎很重要。也许有人可以了解我是否可以在登录时立即获得具有Graph API范围的令牌。也许通过在Azure AD中为应用程序设置所需的权限。
答案 1 :(得分:2)
只是要清楚所有人,再次更新端到端解决方案。
如果您没有基本入门代码,请参阅此链接Adal-JS Tutorial。这篇文章仅涉及所涉及的定制。
第1步:配置AdalService
(仅显示新代码,其他方法保持原样)
export class AdalService {
public get graphAccessToken() {
return sessionStorage[new AppConstants().User_Graph_Token];
}
public retrieveTokenForGraphAPI() {
this.context.acquireToken('https://graph.microsoft.com', function (error, graph_token) {
if (error || !graph_token) {
console.log('ADAL error occurred: ' + error);
} else {
// Store token in sessionStorage
sessionStorage[new AppConstants().User_Graph_Token] = graph_token;
return;
}
}.bind(this)
);
}
}
代码应具有id_token回调的现有处理程序以及路由中的相应配置。如果没有,请参阅上面的链接获取初始代码。
现在,一旦检索到 id_token ,需求就会检索 access_token 。 access_token具有" puid"的附加字段。其中描述了索赔的标识符。这将是第2步。
第2步:更新LoginComponent
ngOnInit() {
if (!this.adalService.isAuthenticated) {
console.log('LoginComponent::Attempting login via adalService');
this.adalService.login();
} else {
if (this.adalService.accessTokenForGraph == null) {
console.log('LoginComponent::Login valid, attempting graph token retrieval');
this.adalService.retrieveTokenForGraphAPI();
}
}
现在检索并存储令牌供以后使用。
第3步:更新' access_token'回调
类似于' id_token'回调,我们需要为access_token添加额外的回调路由。回调组件将保持不变。他们的代码如主链接中所述。注意* access_token"端点是MS提供的,因此请注意不要更改名称。
{ path: 'access_token', component: OAuthCallbackComponent, canActivate: [OAuthCallbackHandler] },
{ path: 'id_token', component: OAuthCallbackComponent, canActivate: [OAuthCallbackHandler] }
第4步:在需要的地方使用令牌
const bearer = this.adalService.graphAccessToken();