我正在尝试编写一个调用Microsoft Graph API的简单Azure函数。但是我无法使access_token工作。这是我所做的:
通过Azure门户创建了一个新的Azure Function应用
打开“ App Service Authentication”设置,并指示其使用AAD登录(管理模式为Express)。
将应用配置为具有Microsoft Graph的委派权限,例如“登录并读取用户个人资料”。
创建了一个新的JavaScript函数HttpTriggerJS1
将此功能的授权级别更改为“匿名”(否则默认情况下,“功能”级别甚至不允许我运行该功能,始终返回401未经授权)
安装了必要的Node模块(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不同。
这有什么问题吗?调用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();
});
});
};