从Node.js脚本获取Microsoft GRAPH访问令牌

时间:2019-03-14 16:41:26

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

此问题基于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。

如果我通过邮递员提交发帖请求,并使用与x-www-form-urlencoded相同的参数,则会在响应正文中收到access_token

那么...我该怎么办?也许-但我不这么认为-这是因为此功能是由(出于测试目的)具有JSON格式主体的POSTMAN GET请求调用的?

2 个答案:

答案 0 :(得分:1)

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

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

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

您将成功获取访问令牌。 enter image description here

答案 1 :(得分:0)

您遇到了两个问题。

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

另一个导致此错误的根本原因是await request.post。请求本身不支持诺言。从请求documentation

  

request本机支持流接口和回调接口。如果您希望request返回一个Promise,则可以为request使用备用接口包装器。如果您更喜欢使用Promises,或者您想在ES2017中使用async / await,这些包装器将非常有用。

     

请求团队提供了多个备用接口,包括: