javascript - 从 Azure Functions 内部调用 Microsoft Graph API

标签 javascript node.js azure microsoft-graph-api azure-functions

我正在尝试编写一个调用 Microsoft Graph API 的简单 Azure 函数。但我无法使 access_token 工作。这是我所做的:

  1. 从 Azure 门户创建了新的 Azure Function 应用
  2. 开启“应用服务身份验证”设置并指示其使用 AAD 登录(管理模式为 Express)。
  3. 将应用配置为具有委派权限,例如 Microsoft Graph 的“登录并读取用户个人资料”。
  4. 创建了新的 JavaScript 函数 HttpTriggerJS1
  5. 将此函数的授权级别更改为“匿名”(否则默认情况下“函数”级别甚至不允许我运行该函数,始终返回 401 Unauthorized)
  6. 安装了必要的 Node 模块(npm install request)
  7. 实际功能:

    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();
        });
    };
    
  8. 在单独的浏览器窗口中测试了此功能。让我正确登录 AAD。

  9. 但是从 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 应用服务身份验证/授权时,有两种方法可以实现此目的:

  1. 在函数应用的 AAD 配置中分配默认资源。
  2. 使用 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 的函数优化版本。

您需要做的主要事情是:

  1. 确保您的 AAD 设置包含客户端 key (您已经拥有该 key )。
  2. 确保您的 AAD 设置有权访问 Microsoft Graph(您已经这样做了)。
  3. 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/

相关文章:

c# - 是否可以通过 Azure 中运行的 Web API 对 Azure 外部的应用程序进行 HTTP 调用?

javascript - 如何让<div>在页面开始加载时自动运行?

javascript - 更改高 map 中的图例大小?

javascript - 如何忽略javascript中的转义字符?

javascript - 由于逗号(javascript)而未添加 2 个值

ios - 将庞大的 Firebase 数据库作为事务更新

node.js - 从 Sails.JS 发出 socket.io 事件并使用 Sails.JS 框架在服务器上处理它

node.js - Heroku 上的特定 npm 版本

azure - 更新 azure-sdk-for-go 库依赖项

powershell - 如何使用 PowerShell 或 CLI 启动本地 Azure Service Fabric 集群