ADAL.js - 获取Graph API资源的令牌

时间:2017-07-11 21:43:35

标签: javascript microsoft-graph adal.js

我在React中开发一个需要与AzureAD和GraphAPI集成的SPA应用程序(隐式流程)。

我的问题非常类似于:ADAL.js - Obtaining Microsoft Graph Access Token with id_token ...但答案并没有向我展示足够的代码让我继续前进。

到目前为止,只使用adal.js(v1.0.14),我可以登录&得到一个id_token,但我无法弄清楚如何使用它来获取对图谱API调用的访问权。

更新:我知道我已正确注册Azure门户,因为我能够登录并获取没有adal.js或任何lib的最新文档......只需使用自制的ajax调用。

这是我的代码,它执行登录/重定向,然后尝试获取我最近的文档:

// Initial setup      
var adalCfg = {
  instance              : 'https://login.microsoftonline.com/',
  tenant                : 'common',
  clientId              : 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx',
  postLogoutRedirectUri : window.location.origin,
  extraQueryParameter   : 'scope=Mail.ReadWrite+Files.Read+Files.ReadWrite+User.ReadBasic.All' // Is this the proper way to specify what resources I need access to?
};

var authContext = new Adal(adalCfg);

if(!authContext.getCachedUser()) {
  authContext.login();  // redirects MS login page successfully
}

// Check For & Handle Redirect From AAD After Login
var isCallback = authContext.isCallback(window.location.hash); // Checks if the URL fragment contains access token, id token or error_description.
if(isCallback) {
  authContext.handleWindowCallback(); // extracts the hash, processes the token or error, saves it in the cache and calls the registered callbacks with the result.
}

if (isCallback && !authContext.getLoginError()) {
  window.location = authContext._getItem(authContext.CONSTANTS.STORAGE.LOGIN_REQUEST); // redirects back to /
}

// Try to get my recent docs - FAILS with InvalidAuthenticationToken error
// UDPATED authContext.acquireToken(authContext.config.clientId, function (error, token) {
authContext.acquireToken('https://graph.microsoft.com', function (error, token) {

  $.ajax({
    url: 'https://graph.microsoft.com/v1.0/me/drive/recent',
    headers:{'authorization':'Bearer '+ token},
    type:'GET',
    dataType:'json'
  }).done(function(res) {
    console.log(res['value']);
  });

});

我有什么问题?

更新2:我根据Fei的回答更改了acquireToken,但现在当adal默默地获取我的资源的访问令牌时,它无法将其传递给我的API调用。

更新的代码:

    adalCfg.endpoints.graphApiUri = "https://graph.microsoft.com";

    authContext.acquireToken(adalCfg.endpoints.graphApiUri, function (errorDesc, token, error) {
      console.log('errorDesc = ' + errorDesc)
      console.log('token = ' + token)      
      console.log('error = ' + error)

      $.ajax({
        url: adalCfg.endpoints.graphApiUri + '/v1.0/me/drive/recent',
        headers:{'authorization':'Bearer '+ token},
        type:'GET',
        dataType:'json'
      }).done(function(res) {
        console.log(res['value']);
      });

    });

和控制台输出:

Token not being captured

图像显示令牌的req,似乎成功,因为下一个GET在哈希中包含access_token。但是,acquireToken会将null令牌传递给我的Graph API调用。

但是,如果我手动从哈希中获取访问令牌,我可以成功进行Graph API调用。

为什么adal不会将访问令牌传递给我的API调用?它回来了,是有效的。

1 个答案:

答案 0 :(得分:1)

要调用Microsoft Graph,我们需要获取此资源的特定令牌。根据代码,您使用authContext.config.clientId获取令牌。

如果您在Azure门户网站上注册该应用程序,要获取Microsoft Graph的访问令牌,您需要将authContext.config.clientId替换为https://graph.microsoft.com

要成功调用REST,我们需要确保拥有足够的权限。例如,要列出最近的文件,需要以下范围之一:Files.ReadFiles.ReadWriteFiles.Read.AllFiles.ReadWrite.AllSites.Read.All,{{1} (参考here)。

更新

Sites.ReadWrite.All