Я разрабатываю веб-приложение, которое читает календарь Microsoft вошедшего в систему пользователя. Моя проблема в том, что с учетными записями @hotmail или @outlook оно читает их без проблем, но при использовании учетной записи @onmicrosoft кажется, что учетная запись не существует, когда я смогу войти непосредственно на сайт office365.
на портале Azure я включил возможность входа в систему с помощью: «Учетные записи в любом каталоге организации (любой вход в систему с идентификатором Microsoft ID — мультитенант) и личные учетные записи Microsoft (например, Skype, Xbox) Приложение или API может использовать любой, у кого есть рабочая или учебная учетная запись, а также личная учетная запись Microsoft. Также включены подписчики Office 365», как показано на рисунке ниже.
и при попытке входа появляется следующее:
перевод: Эта учетная запись Microsoft не существует. Пожалуйста, укажите другой аккаунт или получите новый.
Ввод части кода. Эта часть содержит разрешения, авторизует пользователя и приступает к чтению его календаря.
мои делегированные разрешения API:
User.Read — войти и прочитать профиль пользователя.
Calendars.Read — чтение календарей пользователей.
Calendars.Read.Shared — чтение общих и пользовательских календарей.
Это мой код:
1. Часть, которая обрабатывает вход и проверку пользователя:
document.addEventListener('DOMContentLoaded', async function() {
const msalConfig = {
auth: {
clientId: '...',
authority: 'https://login.microsoftonline.com/consumers',
redirectUri: 'http://localhost/calendario2/outlook.html'
}
};
const msalInstance = new msal.PublicClientApplication(msalConfig);
const loginRequest = {
scopes: ["User.Read", "Calendars.Read", "Calendars.Read.Shared"]
};
try {
await msalInstance.loginRedirect(loginRequest);
} catch (error) {
console.error('Error during authentication:', error);
}
msalInstance.handleRedirectPromise().then(async function(response) {
if (response !== null && response.account !== null) {
// Get calendar events
const events = await getCalendarEvents(response.accessToken);
// Render the calendar with the events obtained
renderCalendar(events);
} else {
console.error('No user account provided.');
}
});
});
и на случай, если кому-то это понадобится
2. Часть, отвечающая за чтение календаря:
async function getCalendarEvents(accessToken) {
const response = await fetch('https://graph.microsoft.com/v1.0/me/events', {
headers: {
'Authorization': `Bearer ${accessToken}`
}
});
if (!response.ok) {
throw new Error('Error getting calendar events');
}
const data = await response.json();
return data.value.map(event => ({
title: event.subject,
start: event.start.dateTime,
end: event.end.dateTime,
allDay: event.isAllDay
}));
}
function renderCalendar(events) {
const calendarEl = document.getElementById('calendar');
const calendar = new FullCalendar.Calendar(calendarEl, {
// Calendar settings
});
calendar.render();
}
Я не знаю, может ли ошибка быть связана с тем, что для использования учетных записей Office365 вам понадобится другой тип авторизации или делегированные разрешения/разрешения для приложений.
Большое спасибо!



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Ошибка произошла, поскольку вы используете /consumers в качестве полномочий, позволяющих входить в систему только учетным записям Microsoft (@hotmail или @outlook).
Я зарегистрировал одно мультитенантное приложение, выбрав «Поддерживаемый тип учетной записи», как показано ниже:
Теперь я добавил разрешения API типа «Делегированный» и предоставил им согласие:
Когда вы запускаете код с полномочиями /consumers и пытаетесь войти в систему с локальными учетными записями, имеющими суффикс onmicrosoft.com, выдается такая ошибка:
Измените свои полномочия на https://login.microsoftonline.com/common/, что позволит пользователям входить в систему как с личными учетными записями, так и с локальными учетными записями, имеющими суффикс onmicrosoft.com.
Чтобы устранить ошибку, измените эту часть кода, изменив значение параметра authority в msalConfig:
document.addEventListener('DOMContentLoaded', async function() {
const msalConfig = {
auth: {
clientId: 'appId',
authority: 'https://login.microsoftonline.com/common', //Make sure to use "common"
redirectUri: 'http://localhost/calendario2/outlook.html'
}
};
const msalInstance = new msal.PublicClientApplication(msalConfig);
const loginRequest = {
scopes: ["User.Read", "Calendars.Read", "Calendars.Read.Shared"]
};
Ссылка: Конфигурация клиентского приложения (MSAL) — платформа идентификации Microsoft
Пожалуйста, опубликуйте новый вопрос, указав более подробную информацию о вашем требовании, и поделитесь этой ссылкой здесь.
Здесь у вас есть! stackoverflow.com/q/78569588/22658214
У меня есть еще одна проблема, которая тоже случается со мной, я вам ее тут быстро объясню или если не буду задавать новый вопрос, то при чтении событий время меняется, если в Outlook событие в 13:00. в моем календаре это 11:00, из всех событий вычитается 2 часа, и это с конфигурацией времени в Мадриде, как в Outlook, так и на моем веб-сайте, но время получается такое: среда, 5 июня 2024 г., 11:30:00 GMT + 0200 (Центральноевропейское летнее время), если предположить, что мероприятие начнется в 13:30.