我正在尝试编写一个调用 Microsoft Graph API 的简单 Azure 函数。但我无法使 access_token 工作。这是我所做的:
- 从 Azure 门户创建了新的 Azure Function 应用
- 开启“应用服务身份验证”设置并指示其使用 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']
获得的 token 。它类似于“AQABAA ....”,这似乎与我之前见过的以“eyJ ....”开头的常规access_token不同。
这里可能出了什么问题?调用 Graph API 时,我是否应该使用请求 header 中的 access_token?
谢谢!
编辑:
根据 Chris Gillum 的建议,我还研究了“代表”流程。这是我更新的函数,它通过提供 id_token(从请求 header 检索)来获取特定资源(在我的例子中为 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 应用服务身份验证/授权时,有两种方法可以实现此目的:
- 在函数应用的 AAD 配置中分配默认资源。
- 使用 AAD on-behalf-of flow将您的 ID token (
x-ms-token-aad-id-token
) 交换为 MS Graph 访问 token 。
不需要任何代码更改的最简单方法是执行#1。我在我的 App Service Auth and the Azure AD Graph API 中概述了该过程。博客文章(需要一些更新),但我将在此处为您提供 Microsoft Graph 的函数优化版本。
您需要做的主要事情是:
- 确保您的 AAD 设置包含客户端 key (您已经拥有该 key )。
- 确保您的 AAD 设置有权访问 Microsoft Graph(您已经这样做了)。
- 在 Resource Explorer 中打开您的函数应用(使用门户中平台设置下的链接),导航至左侧面板上的config/authsettings,将
“additionalLoginParams”
从将null
更改为["resource=https://graph.microsoft.com"]
,然后保存更改。
执行此操作并再次登录后,x-ms-token-aad-access-token
请求 header 将始终为您提供可与 Microsoft Graph 配合使用的访问 token 。
上述方法的缺点是,如果您需要从函数应用访问多个受 AAD 保护的资源,它对您没有帮助。如果这对您来说是个问题,那么您需要使用上面的方法#2。
关于javascript - 从 Azure Functions 内部调用 Microsoft Graph API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44010063/