【发布时间】:2017-10-08 21:48:34
【问题描述】:
我正在尝试编写一个调用 Microsoft Graph API 的简单 Azure 函数。但我无法使 access_token 工作。这是我所做的:
- 从 Azure 门户创建了一个新的 Azure Function App
- 开启“App Service Authentication”设置,并指示其使用 AAD 登录(管理模式为 Express)。
- 将应用配置为具有委派权限,例如 Microsoft Graph 的“登录并读取用户配置文件”。
- 创建了一个新的 JavaScript 函数 HttpTriggerJS1
- 将此函数的授权级别更改为“匿名”(否则默认情况下“函数”级别甚至不允许我运行该函数,总是返回 401 Unauthorized)
- 安装了必要的 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(从请求标头中检索)来获取特定资源的 access_token(在我的情况下为 https://graph.microsoft.com)。:
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();
});
});
};
【问题讨论】:
-
我认为问题在于您使用的令牌没有与之关联的任何资源。我通常可以说,因为令牌不是你注意到的 JWT。我将添加一个答案,其中包含一些您必须获得正确令牌形状的选项。
标签: javascript node.js azure microsoft-graph-api azure-functions