Как получить токен Microsoft Graph API Access из Node Script?

Я хотел бы использовать эту библиотеку для взаимодействия с API графа для моей AD - https://github.com/microsoftgraph/microsoft-graph-docs/blob/master/concepts/nodejs.md

Тем не менее, все существующие библиотеки javascript, которые я обнаружил, чтобы возвращать токены доступа, ожидают передачи URL-адреса возврата, а также некоторые другие специфичные для сети вещи, что позволяет мне полагать, что это своего рода требование со стороны Microsoft.

Есть ли какой-нибудь хороший способ для аутентификации / получения токена доступа во время выполнения сценария бэкэнд-узла (не связанного с веб-интерфейсом), чтобы я мог начать делать вызовы Microsoft Graph API? Заранее спасибо за совет.

4 ответа

Решение

Для запуска внутреннего демона без аутентификации пользователя, подключенного к Graph API, вы хотите использовать поток аутентификации только для приложения. Вот краткое изложение официальных шагов:

  1. Создайте своего Azure AD Tenant. Обратите внимание yourtenant.onmicrosoft.com имя, и скопируйте это значение вниз.
  2. Зарегистрируйте заявку через глобальный Azure Active Directory клинка App Registrations раздел, а не непосредственно в свойствах арендатора. Скопируйте Application ID; это понадобится нам позже.
  3. Создайте ключ, связанный с регистрацией, и не забудьте скопировать его. После того, как вы щелкнете мышью, вы не сможете вернуть значение ключа, поэтому обязательно скопируйте его.
  4. Также обновите разрешения регистрации до того, что вам нужно, нажмите Save, а затем также ударил Grant Permissions кнопка.
  5. Сделайте HTTP-запрос к login.microsoftonline.com домен для получения токена доступа.
  6. Используйте токен доступа для выполнения запросов API Graph.

Вот ссылка на пример Microsofts Node.js, а также ссылка на прямую документацию по HTTP-вызову для получения токена доступа. А вот супер урезанный пример, который выведет полученный токен доступа. Заменить [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, мы можем вызвать API Graph. Предполагая, что права доступа к приложениям были настроены правильно и применены с шага № 4, мы можем начать делать запросы к API Graph:

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

BU0 не сработал для меня правильно, потому что Microsoft изменила способ использования графического API, поэтому я не смог получить все необходимые данные. Вот как я это сделал, используя ответ BU0 и этот урок:

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

Другой путь:

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

У меня возникла проблема с использованием строки URL-адреса для конечной точки const

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

Вместо этого я передал арендатора таким образом, а не из документации Microsoft graph api:

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

Ссылка из документации -> Запросить код авторизации

Другие вопросы по тегам