В авторизации отказано при попытке доступа к 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"
};
Надеюсь, это поможет ~