编程语言
首页 > 编程语言> > javascript – 从Azure Functions中调用Microsoft Graph API

javascript – 从Azure Functions中调用Microsoft Graph API

作者:互联网

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

>从Azure门户创建了一个新的Azure功能应用程序
>打开“App Service Authentication”设置并指示其使用AAD登录(管理模式为Express).
>将应用程序配置为具有委派权限,例如Microsoft Graph的“登录和读取用户配置文件”.
>创建了一个新的JavaScript函数HttpTriggerJS1
>将此功能的授权级别更改为“匿名”(否则默认情况下“功能”级别甚至不允许我运行该功能,始终返回401 Unauthorized)
>安装必要的Node模块(npm安装请求)
>和实际功能:

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();
        });
    });
};

解决方法:

使用Azure App Service身份验证/授权时,有两种方法可以使这项工作:

>在功能应用程序的AAD配置中分配默认资源.
>使用AAD on-behalf-of flow交换您的ID令牌(x-ms-token-aad-id-token)以获取MS Graph访问令牌.

不需要任何代码更改的最简单方法是执行#1.我在App Service Auth and the Azure AD Graph API博客文章(需要一些更新)中概述了这个过程,但我将在这里为您提供Microsoft Graph的功能优化版本.

您需要做的主要事情是:

>确保您的AAD设置包含客户端密钥(您已经拥有此密码).
>确保您的AAD设置具有访问Microsoft Graph的权限(您已经完成了此操作).
>在Resource Explorer中打开您的功能应用程序(使用平台设置下的门户中的链接),导航到左侧面板上的config / authsettings,将“additionalLoginParams”从null更改为[“resource = https://graph.microsoft”. com“],并保存更改.

执行此操作并再次登录后,x-ms-token-aad-access-token请求标头将始终为您提供与Microsoft Graph一起使用的访问令牌.

上述方法的缺点是,如果您需要从功能应用程序访问多个受AAD保护的资源,它将无法帮助您.如果这对您来说是个问题,那么您需要使用上面的方法#2.

标签:javascript,node-js,azure,azure-functions,microsoft-graph
来源: https://codeday.me/bug/20190627/1307340.html