В моей организации Microsoft 365 есть несколько пользователей с соответствующими адресами электронной почты.
Я хотел бы иметь возможность планировать встречи между пользователями как администратор организации, а не как один из пользователей.
Каждый метод аутентификации, который я пытаюсь использовать ms graph api, приводит к ошибке, в которой говорится, что планирование календаря доступно только в делегированном режиме.
Не уверен, какой подход здесь правильный, мне нужен полностью программный способ управления календарями пользователей моей организации. Решение, требующее от пользователя аутентификации с использованием oauth2 (требует взаимодействия с пользователем), в этом случае не подходит.
Вот код, в настоящее время с проверкой подлинности сертификата.
const tenantId = '###';
const clientId = '###';
const certificatePath = 'file.pem';
const credential = new ClientCertificateCredential(
tenantId,
clientId,
certificatePath,
);
// @microsoft/microsoft-graph-client/authProviders/azureTokenCredentials
const authProvider = new TokenCredentialAuthenticationProvider(credential, {
scopes: ['https://graph.microsoft.com/.default'],
});
const graphClient = Client.initWithMiddleware({ authProvider: authProvider });
const event = {
subject: 'Testing meeting scheduling',
body: {
contentType: 'HTML',
content: 'Is it working?',
},
start: {
dateTime: '2024-05-22T11:00:00',
timeZone: 'Pacific Standard Time',
},
end: {
dateTime: '2024-05-22T12:00:00',
timeZone: 'Pacific Standard Time',
},
location: {
displayName: 'Room 22',
},
attendees: [
{
emailAddress: {
address: '[email protected]',
name: 'User A',
},
type: 'required',
},
{
emailAddress: {
address: '[email protected]',
name: 'User B',
},
type: 'required',
},
],
transactionId: '?',
};
const calendarId = '################';
console.info("Scheduling....")
graphClient.api(`/me/calendars/${calendarId}/events`).post(event)
.then(response => {
console.info('Event created successfully:', response);
})
.catch(error => {
console.error('Error creating event:', error);
});
Получение ошибки:
{
"code": "BadRequest",
"message": "/me request is only valid with delegated authentication flow.",
"innerError": {
"date": "2024-04-30T09:04:28",
"request-id": "921c1689-14a7-4452-8870",
"client-request-id": "2dd01605-5566-0f41"
}
}


Ошибка обычно возникает, если вы вызываете конечную точку /me с токеном, сгенерированным потоком учетных данных клиента.
Я зарегистрировал одно приложение Entra ID и добавил Calendars.ReadWrite разрешение типа приложения, как показано ниже:

Когда я вызвал конечную точку /me с токеном, сгенерированным потоком учетных данных клиента, я тоже получил ту же ошибку, что и ниже:
const calendarId = '################';
console.info("Scheduling....")
graphClient.api(`/me/calendars/${calendarId}/events`).post(event)
.then(response => {
console.info('Event created successfully:', response);
})
.catch(error => {
console.error('Error creating event:', error);
});
Ответ:

Чтобы устранить эту ошибку, замените /me на «/users/userId» в коде, поскольку поток учетных данных клиента не является делегированным потоком для поддержки конечной точки /me.
Когда я снова запустил код после замены его на /users/userId, я получил ответ, в котором событие успешно создано, как показано ниже:
const calendarId = '################';
console.info("Scheduling....")
graphClient.api(`/users/userId/calendars/${calendarId}/events`).post(event)
.then(response => {
console.info('Event created successfully:', response);
})
.catch(error => {
console.error('Error creating event:', error);
});
Ответ:

Вы не можете использовать конечную точку
/meс потоком учетных данных клиента. Замените его на/users/userId/