如何从Node Script获取Microsoft Graph API访问令牌?

时间:2018-05-30 21:32:01

标签: node.js azure-active-directory azure-ad-graph-api

我想使用此库与我的AD的图API进行互动 - https://github.com/microsoftgraph/microsoft-graph-docs/blob/master/concepts/nodejs.md

但是,我发现所有返回访问令牌的现有javascript库都希望传入返回URL,以及其他一些特定于Web的内容,这让我相信这是某种要求在微软的结束。

在运行后端节点脚本时没有任何好的方法来验证/接收访问令牌(没有任何与Web相关的),以便我可以开始对Microsoft Graph API进行调用吗?提前感谢您的建议。

4 个答案:

答案 0 :(得分:4)

要运行连接到Graph API的未经用户身份验证的后端守护程序,您要使用仅应用程序身份验证流程。以下是the official steps的快速摘要:

  1. 创建您的Azure AD租户。记下yourtenant.onmicrosoft.com名称,然后将此值复制下来。
  2. 通过全局Azure Active Directory刀片服务器的App Registrations部分(而不是直接在租户属性中)注册应用程序。复制Application ID;我们以后再用。
  3. 创建与注册相关的密钥,并记住将其复制下来。单击后,您将无法找回键值,因此请确保将其复制。
  4. 还将注册的权限更新为所需的权限,单击Save,然后单击Grant Permissions按钮。
  5. login.microsoftonline.com域发出HTTP请求以获取访问令牌。
  6. 使用访问令牌发出Graph API请求。

Here's a link to Microsofts Node.js example,这是指向HTTP调用上的direct documentation的链接,用于检索访问令牌。这是一个超级精简的示例,将输出检索到的访问令牌。替换[Tenant][ApplicationID][Key]的值:

const request = require("request");

const endpoint = "https://login.microsoftonline.com/[Tenant].onmicrosoft.com/oauth2/token";
const requestParams = {
    grant_type: "client_credentials",
    client_id: "[ApplicationID]",
    client_secret: "[Key]",
    resource: "https://graph.windows.net"
};

request.post({ url:endpoint, form: requestParams }, function (err, response, body) {
    if (err) {
        console.log("error");
    }
    else {
        console.log("Body=" + body);
        let parsedBody = JSON.parse(body);         
        if (parsedBody.error_description) {
            console.log("Error=" + parsedBody.error_description);
        }
        else {
            console.log("Access Token=" + parsedBody.access_token);
        }
    }
});

一旦有了access_token,我们就可以调用Graph API。假设正确配置了应用程序权限并从第4步开始应用,我们可以开始发出Graph API请求:

function testGraphAPI(accessToken) {
    request.get({
        url:"https://graph.windows.net/[Tenant]/users?api-version=1.6",
        headers: {
          "Authorization": accessToken
        }
    }, function(err, response, body) {
        console.log(body);
    });
}

答案 1 :(得分:1)

BU0的答案对我来说无法正常工作,因为Microsoft更改了使用图形API的方式,因此我无法获取所需的所有数据。这是我使用BU0答案和此tutorial进行的操作:

const request = require("request");

const endpoint = "https://login.microsoftonline.com/[Tenant]/oauth2/v2.0/token";
const requestParams = {
    grant_type: "client_credentials",
    client_id: "[ApplicationID]",
    client_secret: "[Key]",
    scope: "https://graph.microsoft.com/.default"
};

request.post({ url:endpoint, form: requestParams }, function (err, response, body) {
    if (err) {
        console.log("error");
    }
    else {
        console.log("Body=" + body);
        let parsedBody = JSON.parse(body);         
        if (parsedBody.error_description) {
            console.log("Error=" + parsedBody.error_description);
        }
        else {
            console.log("Access Token=" + parsedBody.access_token);
        }
    }
});

function testGraphAPI(accessToken) {
    request.get({
        url:"https://graph.microsoft.com/v1.0/users",
        headers: {
          "Authorization": "Bearer " + accessToken
        }
    }, function(err, response, body) {
        console.log(body);
    });
}

答案 2 :(得分:0)

在const端点使用url字符串时,我遇到了一些问题

https://login.microsoftonline.com/[Tenant]/oauth2/v2.0/token

相反,我以这种方式从Microsoft graph api docs中通过了租户:

https://login.microsoftonline.com/{tenant}/oauth2/v2.0/authorize

文档参考-> Request an authorization code

答案 3 :(得分:0)

另一种方式:

'use strict';

const axios = require('axios');
const qs = require('qs');

const accessTokenWithCredentials = (tenantId, clientId, clientSecret, resource) => {
    const data = {
        resource: resource,
        grant_type: 'client_credentials',

    };
    
    return axios({
        url: `https://login.windows.net/${tenantId}/oauth2/token`,
        method: "post",
        headers: { 'content-type': 'application/x-www-form-urlencoded' },
        auth: {
        username: clientId,
        password: clientSecret,
        },
        data:  qs.stringify(data)
    }).catch(error => {
        throw error;
    })
};

调用函数:

accessTokenWithCredentials(<tenantId>, <clientId>, <clientSecret>, 'https://graph.microsoft.com').then(response => {
    console.log(`Got access token`);
    const token = JSON.stringify(response.data.access_token);

    // do what you need to do

}).catch(err => {
     console.log("err " + err);
     throw err;
});