我正在尝试编写一个调用Microsoft Graph API的简单Azure函数。但是我无法使access_token工作。这是我所做的:
npm install request
var request = require('request'); module.exports = function (context, req) { var token = req.headers['x-ms-token-aad-access-token']; var reqUrl = 'https://graph.microsoft.com/v1.0/me/'; request.get(reqUrl, {'auth': {'bearer': token}}, function (err, response, msg) { context.res = { body: msg }; context.done(); }); };
在单独的浏览器窗口中测试了此功能。正确登录AAD。
但是从Graph返回的消息是:
"{ "error": { "code": "InvalidAuthenticationToken", "message": "CompactToken parsing failed with error code: -2147184105", "innerError": { "request-id": "4c78551d-f0fe-4104-b1d3-e2d96fd3c02c", "date": "2017-05-16T19:11:14" } } }"
我调查了从中获得的令牌req.headers['x-ms-token-aad-access-token']。类似于“ AQABAA ....”,它似乎与我之前见过的以“ eyJ ....”开头的常规access_token不同。
req.headers['x-ms-token-aad-access-token']
这有什么问题吗?调用Graph API时,是否应该使用请求标头中的access_token?
谢谢!
根据克里斯·吉伦(Chris Gillum)的建议,我还研究了“代收”流程。这是我更新的函数,它通过提供id_token(从请求标头中检索)来获取特定资源(在我的情况下为https://graph.microsoft.com)的access_token 。
var request = require('request'); module.exports = function (context, req) { var parameters = { grant_type: 'urn:ietf:params:oauth:grant-type:jwt-bearer', client_id: process.env.WEBSITE_AUTH_CLIENT_ID, client_secret: process.env.WEBSITE_AUTH_CLIENT_SECRET, assertion: req.headers['x-ms-token-aad-id-token'], resource: 'https://graph.microsoft.com', requested_token_use: 'on_behalf_of' }; request.post('https://login.microsoftonline.com/microsoft.com/oauth2/token', {form: parameters}, function (aadErr, aadResponse, aadMsg) { var msgJson = JSON.parse(aadMsg); request.get('https://graph.microsoft.com/v1.0/me/', {'auth': {'bearer': msgJson.access_token}}, function (err, response, msg) { context.res = { body: msg }; context.done(); }); }); };
使用Azure App Service身份验证/授权时,有两种方法可以使此项工作:
x-ms-token-aad-id-token
不需要任何代码更改的最简单方法是执行#1。我在我的App Service Auth和Azure AD Graph API博客文章(需要一些更新)中概述了该过程,但是在这里我将为您提供Microsoft Graph的经过功能优化的版本。
您需要做的主要事情是:
"additionalLoginParams"
null
["resource=https://graph.microsoft.com"]
完成此操作并再次登录后,x-ms-token-aad-access-token请求标头将始终为您提供与Microsoft Graph一起使用的访问令牌。
x-ms-token-aad-access-token
上述方法的缺点是,如果您需要从功能应用程序访问多个受AAD保护的资源,那么它无济于事。如果这对您来说是个问题,那么您将需要使用上面的方法2。