В авторизации отказано при попытке доступа к API Bookings в Microsoft Graph

Я пытаюсь создать приложение, работающее с лямбда-выражением AWS, которое действует как посредник для клиентов, желающих подписаться на бронирование с помощью Microsoft Bookings. Следуя документации, я могу сгенерировать токен доступа для Graph, но получаю отказ в авторизации, когда пытаюсь запросить информацию из бронирований через api.

Мой код:

import request from "request";
import { Callback } from "./callback";

const APP_ID = process.env.BOOKINGS_APP_ID;
const APP_SECRET = process.env.BOOKINGS_API_SECRET;
const TOKEN_ENDPOINT = `https://login.microsoftonline.com/${process.env.BOOKINGS_TENANT_NAME}.onmicrosoft.com/oauth2/token`;

const requestParams = {
    client_id: APP_ID,
    client_secret: APP_SECRET,
    grant_type: "client_credentials",
    resource: "https://graph.microsoft.com",
    scope: "https://graph.microsoft.com/.default",
};

export default class Bookings {
    public static async listBusinesses(callback: Callback) {
        Bookings.generateAPIToken((err: string | null, data: any) => {
            const options = {
                // body: {},
                headers: {
                    "Authorization": `Bearer ${data}`,
                    "Content-Type": "application/json",
                },
                method: "GET",
                url: "https://graph.microsoft.com/beta/bookingBusinesses",
            };

            console.log(data);

            return request(options, (error: string, res: any) => {
                if (error) {
                    return callback(error, {});
                }

                return callback(null, JSON.parse(res.body));
            });
        });
    }

    public static async generateAPIToken(callback: Callback) {
        request.post({ url: TOKEN_ENDPOINT, form: requestParams }, (err, res, body) => {
            if (err) {
                return callback(err, {});
            }

            return callback(null, JSON.parse(body).access_token);
        });
    }
}

Ошибка, которую я получаю:

{
    error: {
        code: '',
        message: 'Authorization has been denied for this request.',
        innerError: {
            'request-id': '695d3f90-357d-490c-b980-4a2018dd39a5',
            date: '2020-06-08T03:21:59'
        }
    }
}

Я также пробовал использовать библиотеку microsoft-graph-client для доступа к бронированиям, но это тоже не работает. Что я делаю не так? Спасибо за любую помощь.

1 ответ

Решение

Мы видим, что в документе показан график api(bookingBusshops), который вы хотите запросить, требует разрешений делегированного типа и не поддерживает разрешение типа приложения.

Таким образом, мы не можем использовать поток предоставления client_credentials, ваш код показывает, что вы используете client_credentials в качестве типа предоставления. Вместо этого вы можете использовать поток предоставления "имя пользователя / пароль", чтобы получить токен доступа. Таким образом, параметр, который вы запрашиваете для токена доступа, должен быть таким, как показано ниже:

const requestParams = {
    client_id: APP_ID,
    client_secret: APP_SECRET,
    grant_type: "password",
    scope: "https://graph.microsoft.com/.default",
    username: "your user name/email(like xxxxx@xxx.onmicrosoft.com)",
    password: "your password"
};

Кстати, я заметил, что "TOKEN_ENDPOINT" в вашем коде https://login.microsoftonline.com/${process.env.BOOKINGS_TENANT_NAME}.onmicrosoft.com/oauth2/token и вы используете оба параметра resource а также scope в requestParams. Если мы используем конечную точку v1 в качестве вашего кода, нам просто нужно использовать параметрresource. Если мы используем конечную точку v2(https://login.microsoftonline.com/${process.env.BOOKINGS_TENANT_NAME}.onmicrosoft.com/oauth2/v2.0/token), нам нужно использовать параметр scope вместо параметра resource. Код, который я предоставил выше, использует v2, поэтому я используюscope param, и вам также необходимо изменить "TOKEN_ENDPOINT" на v2(просто добавьте v2.0 между oauth2/ а также /token).

Если вы не хотите менять "TOKEN_ENDPOINT" на v2, просто используйте параметры, как показано ниже:

const requestParams = {
    client_id: APP_ID,
    client_secret: APP_SECRET,
    grant_type: "password",
    resource: "https://graph.microsoft.com",
    username: "your user name/email(like xxxxx@xxx.onmicrosoft.com)",
    password: "your password"
};

Надеюсь, это поможет ~

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