【问题标题】:How to get Microsoft Graph API Access token from Node Script?如何从节点脚本获取 Microsoft Graph API 访问令牌?
【发布时间】:2018-11-09 20:05:11
【问题描述】:

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

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

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

【问题讨论】:

  • 只是为了确认,你想在没有UI的情况下获得token吗?
  • @WayneYang-MSFT - 是的,没错。

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


【解决方案1】:

要运行连接到 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);
    });
}

【讨论】:

  • 我希望在“client_credentials”中填充什么?在您发送的示例项目中,他们也没有解释,只是引用了不太有用的文档。
  • @Alon 抱歉,不清楚!您确实传递了字符串“client_credentials”。这不是你改变的东西。此魔术字符串表示非用户相关身份验证的 OAuth 授权类型。您可以阅读有关此特定 OAuth 授权类型的更多信息here
【解决方案2】:

BU0 的回答对我来说不能正常工作,因为微软改变了他们使用图形 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);
    });
}

【讨论】:

    【解决方案3】:

    我在为 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

    【讨论】:

      【解决方案4】:

      另一种方式:

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

      【讨论】:

        猜你喜欢
        • 2019-08-05
        • 1970-01-01
        • 2023-01-01
        • 2017-08-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多