ADAL.js - 使用id_token获取Microsoft图形访问令牌

时间:2017-06-28 12:44:21

标签: azure-active-directory microsoft-graph adal adal.js

我正在尝试将Azure AD登录和Graph API集成到我的angular2网站。

我已经成功实施了一个ADAL登录和重定向,围绕一个有用的博客帖子here

从这里我检索了我的adalservice可以访问的id_token参数。目前,这是通过简单的context.login()实现并在重定向中捕获令牌。

当我使用此令牌尝试访问Microsoft Graph时,收到InvalidAuthenticationToken响应,声明Access Token validation failure

API call with obtained "access_token"

我对这些东西不熟悉,所以可能是我的电话本质上是错误的,或者我在AD中缺少某些权限,或者我的app reg缺少权限。我已经看到我可能需要请求具有足够范围的访问令牌,但我可以找到这方面的任何示例。

是否有人使用此adalService库获取用于Graph API的令牌?

2 个答案:

答案 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();