Как получить токен доступа Azure с помощью Node js API с помощью Axios

У меня есть бэкэнд в Nodejs, использующий Axios для вызовов API. Мне нужно реализовать аутентификацию Azure, чтобы получить токен, поэтому я следовал приведенному ниже образцу:

https://docs.microsoft.com/en-us/azure/active-directory/develop/quickstart-v2-nodejs-webapp-msal?WT.mc_id=Portal-Microsoft_AAD_RegisteredApps

В образце используется экспресс и есть перенаправления для первого получения и авторизации, а затем токена. Я пытался найти образец с помощью Axios, но не смог его найти.

Это то, что у меня есть до сих пор, идея использовать результат для получения токена, любые рекомендации очень ценны.

const msal = require('@azure/msal-node');


const REDIRECT_URI = "http://localhost:3000/";
const LOGIN = "https://login.microsoftonline.com/";


const config = {
    auth: {
        clientId: "12345678910",
        authority: "https://login.microsoftonline.com/12345678910",
        clientSecret: "Secret",
        knownAuthorities: ["https://login.microsoftonline.com/12345678910"
    ]
    }
};

const pca = new msal.ConfidentialClientApplication(config);

module.exports = {

    async getAzureAdToken(){

        try {

            let instance = axios.create({baseURL: LOGIN});
            
            const authCodeUrlParameters = {
                scopes: ["user.read"],
                redirectUri: REDIRECT_URI
            };

            pca.getAuthCodeUrl(authCodeUrlParameters).then((response) =>{

                let url = response.substring(LOGIN.length);

                instance.get(url).then((result) =>{


                });

            }).catch((error) => console.log(JSON.stringify(error)));
        } catch (error) {
            throw error
        }
    },

person Classic    schedule 08.04.2021    source источник


Ответы (1)


Вы можете использовать клиент поток учетных данных, чтобы получить токен доступа с помощью axios. Поток учетных данных клиента позволяет веб-службе (конфиденциальному клиенту) использовать свои собственные учетные данные вместо олицетворения пользователя для аутентификации при вызове другой веб-службы. В потоке учетных данных клиента разрешения предоставляются непосредственно самому приложению администратором. Нам нужно добавить разрешения для приложений в API Permission.

Тест в почтальоне:

POST https://login.microsoftonline.com/{tenant}/oauth2/v2.0/token
Content-Type: application/x-www-form-urlencoded

client_id=<client_id>
&scope=https://graph.microsoft.com/.default
&client_secret=<client_secret>
&grant_type=client_credentials

Код с использованием Nodejs:

// Replace these values from the values of you app
const APP_ID = '[APP_ID/CLIENT_ID]';
const APP_SECERET = '[CLIENT_SECRET]';
const TOKEN_ENDPOINT ='https://login.microsoftonline.com/[TENANT_ID]/oauth2/v2.0/token';
const MS_GRAPH_SCOPE = 'https://graph.microsoft.com/.default';

const axios = require('axios');
const qs = require('qs');

const postData = {
  client_id: APP_ID,
  scope: MS_GRAPH_SCOPE,
  client_secret: APP_SECERET,
  grant_type: 'client_credentials'
};

axios.defaults.headers.post['Content-Type'] =
  'application/x-www-form-urlencoded';

let token = '';

axios
  .post(TOKEN_ENDPOINT, qs.stringify(postData))
  .then(response => {
    console.log(response.data);
  })
  .catch(error => {
    console.log(error);
  });
person Pamela Peng    schedule 09.04.2021
comment
Если мой ответ полезен, примите его как ответ, спасибо. - person Pamela Peng; 09.04.2021
comment
Привет, мне удалось получить токен доступа, используя приведенный выше пример, однако я не могу использовать токен для вызова Microsoft Graph и получения информации о пользователе. Когда я пытаюсь это сделать, я получаю следующее: Недостаточно прав для завершения операции. Нужно ли мне использовать другой тип аутентификации? Мне нужны как учетные данные клиента, так и информация о пользователе. - person Classic; 10.04.2021
comment
Привет, @Classic. Не могли бы вы поделиться своими разрешениями api на портале? Обычно мы добавляем User.Read.All разрешения приложения в Microsoft Graph API. И не забудьте дать согласие администратора для вашего клиента. - person Pamela Peng; 11.04.2021
comment
Привет, Памела, я проверил портал, и разрешения установлены. - person Classic; 12.04.2021
comment
Я использовал образец кода одностраничного приложения, чтобы проверить получение профиля пользователя, и он сработал. Я заметил, что в JavaScript используется метод входа в систему, который принимает массив областей видимости, чего я не использую в своем коде. Я просмотрел код @ azure / msal и не нашел ничего похожего. - person Classic; 12.04.2021
comment
Но код использует поток учетных данных клиента, которому в моем ответе требуется разрешение приложения. Одностраничное приложение использует делегированное разрешение. - person Pamela Peng; 12.04.2021