【问题标题】:Get Microsoft GRAPH access token from Nodejs script从 Nodejs 脚本获取 Microsoft GRAPH 访问令牌
【发布时间】:2019-08-05 15:55:24
【问题描述】:

这个问题建立在How to get Microsoft Graph API Access token from Node Script? 之上,但是,作为第一次使用,我没有必要的声誉来评论该线程中接受的答案。

问题是,我尝试实施接受的答案建议的方法,但在某个地方出错了。下面的代码是异步函数的一部分,我已经可以告诉你ONEDRIVE_TENANT_URI is 格式为XXX.onmicrosoft.com

const endpoint = `https://login.microsoftonline.com/${process.env.ONEDRIVE_TENTANT_URI}/oauth2/token`;
const requestParams = {
  grant_type: "client_credentials",
  client_id: process.env.ONEDRIVE_APP_ID,
  client_secret: process.env.ONEDRIVE_CLIENT_SECRET,
  resource: "https://graph.windows.net"
};

const authResponse = await request.post({
  url: endpoint,
  form: requestParams
});

authResponse 获取的只是一个字符串,其中填写了上面定义的 requestParams。

如果我通过 Postman 提交发布请求,使用与 x-www-form-urlencoded 相同的参数,我会在响应正文中得到一个 access_token

那么...我做错了什么?也许 - 但我不这么认为 - 这是因为这个函数是由一个(用于测试目的)带有 json 格式正文的 POSTMAN GET 请求调用的?

【问题讨论】:

  • 这里没什么可做的。请编辑您的问题并添加一些额外的代码,特别是您设置requestParams 的位置。也不清楚您如何或在何处注册您的应用程序。
  • 根据您的要求添加了一些代码!

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


【解决方案1】:

您可以下载示例here。并在config.js 中填写凭据。您可以从 Azure 门户中找到它们。

这是获取访问令牌的代码。

auth.getAccessToken = function () {
  var deferred = Q.defer();

  // These are the parameters necessary for the OAuth 2.0 Client Credentials Grant Flow.
  // For more information, see Service to Service Calls Using Client Credentials (https://msdn.microsoft.com/library/azure/dn645543.aspx).
  var requestParams = {
    grant_type: 'client_credentials',
    client_id: config.clientId,
    client_secret: config.clientSecret,
    resource: 'https://graph.microsoft.com'
  };

  // Make a request to the token issuing endpoint.
  request.post({ url: config.tokenEndpoint, form: requestParams }, function (err, response, body) {
    var parsedBody = JSON.parse(body);
    console.log(parsedBody);
    if (err) {
      deferred.reject(err);
    } else if (parsedBody.error) {
      deferred.reject(parsedBody.error_description);
    } else {
      // If successful, return the access token.
      deferred.resolve(parsedBody.access_token);
    }
  });

  return deferred.promise;
};

您将成功获得访问令牌。

【讨论】:

  • 是的,我知道它应该可以工作 - 但它没有。我遵循相同的示例/教程,它确实在 Postman 中作为直接 POST 请求工作,但是当它是由 GET 请求发起的更大功能流的一部分时,它似乎失败了......虽然我不认为应该提出一个问题...我也将graph.windows.net更改为graph.microsoft.com,但无济于事。
  • 您是否对样本进行了任何更改?
  • 没有错误信息,它只是返回一个包含大量数据的无用响应,而不是您期望的数据。如前所述,它有一个“body”,但它的值只是 requestParams 的查询字符串
  • 请将您的请求代码修改为这些代码进行尝试。 request.post({ url: config.tokenEndpoint, form: requestParams }, function (err, response, body) { var parsedBody = JSON.parse(body); console.log(parsedBody); if (err) { deferred.reject (err); } else if (parsedBody.error) { deferred.reject(parsedBody.error_description); } else { // 如果成功,返回访问令牌 deferred.resolve(parsedBody.access_token); } });跨度>
  • request.post({ url: endpoint, form: requestParams },function(err,response,body){ console.log(body); } ) 试试这个,看看它是否有效。
【解决方案2】:

您遇到了两个问题。

第一个问题,但一旦您尝试调用 Microsoft Graph,就会出现问题。 resource 应该是 graph.microsoft.net不是 graph.windows.netgraph.windows.net 指的是旧版 Azure AD Graph API,而不是 Microsoft Graph。

另一个问题是此错误的根本原因,是await request.post。 Request 本身并不支持 Promise。来自请求documentation

request 原生支持流接口和回调接口。如果您希望 request 改为返回 Promise,您可以使用 request 的替代接口包装器。如果您更喜欢使用 Promises,或者如果您想在 ES2017 中使用 async/await,这些包装器会很有用。

请求团队提供了几个替代接口,包括:

【讨论】:

    猜你喜欢
    • 2018-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-31
    • 1970-01-01
    • 2023-01-01
    • 2022-01-12
    • 1970-01-01
    相关资源
    最近更新 更多