Получить токен доступа Microsoft GRAPH из скрипта Nodejs - PullRequest
2 голосов
/ 14 марта 2019

Этот вопрос основан на Как получить токен Microsoft Graph API Access из 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 в теле ответа.

Итак ... Что я делаю не так?Возможно - но я так не думаю - это потому, что эта функция вызывается (для целей тестирования) запросом POSTMAN GET с телом в формате json?

Ответы [ 2 ]

1 голос
/ 15 марта 2019

Вы можете скачать образец здесь .И введите учетные данные в 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

0 голосов
/ 15 марта 2019

У вас есть две проблемы.

Первая не проблема пока , но это произойдет, как только вы попытаетесь вызвать Microsoft Graph.resource должно быть graph.microsoft.net, , а не graph.windows.net.graph.windows.net относится к устаревшему API Graph Azure AD Graph, а не к Microsoft Graph.

Другая проблема, которая является основной причиной этой ошибки, await request.post.Запрос изначально не поддерживает обещания.Из запроса документация :

request изначально поддерживает интерфейсы потоковой передачи и обратного вызова.Если вы хотите, чтобы request возвратил Обещание, вы можете использовать альтернативную оболочку интерфейса для request.Эти обертки могут быть полезны, если вы предпочитаете работать с Promises или если вы хотите использовать async / await в ES2017.

Группа запросов предоставляет несколько альтернативных интерфейсов, включая:

...