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

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

我正在尝试编写一个调用 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'] 获得的 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 设置包含客户端 secret (您已经拥有此)。
  • 确保您的 AAD 设置具有访问 Microsoft Graph 的权限(您已经这样做了)。
  • Resource Explorer 中打开您的函数应用(使用 平台设置 下的门户中的链接),导航到 配置/身份验证设置 在左侧面板上,更改 "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/

    相关文章:

    javascript - 将href网址更改为父级li菜单中的#标签

    node.js - 在 nodejs 中发布后重定向错误 'Can' t set headers after they are sent'

    sockets - Node.js中的套接字

    c# - 在 ASP.NET Core 2.0 中使用带有标识模型的 Azure Active Directory OAuth

    c# - 如何使用 Azure TableClient 2.0 BeginExecuteQuerySegmented

    javascript - 单击图像的不同部分时触发事件 - javascript

    javascript - 具有不同前缀和后缀表达式的共享子表达式的正则表达式更改

    javascript - 如何从不同网站的嵌入网址生成缩略图?

    node.js - 使用 grunt 时是否需要为每个项目创建 node_modules 文件夹

    azure - relay WebHttp Relay 绑定(bind)到 web api 服务