Проблема при попытке прочитать календарь Office365

Я разрабатываю веб-приложение, которое читает календарь 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 вам понадобится другой тип авторизации или делегированные разрешения/разрешения для приложений.

Большое спасибо!

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
71
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ошибка произошла, поскольку вы используете /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

У меня есть еще одна проблема, которая тоже случается со мной, я вам ее тут быстро объясню или если не буду задавать новый вопрос, то при чтении событий время меняется, если в Outlook событие в 13:00. в моем календаре это 11:00, из всех событий вычитается 2 часа, и это с конфигурацией времени в Мадриде, как в Outlook, так и на моем веб-сайте, но время получается такое: среда, 5 июня 2024 г., 11:30:00 GMT + 0200 (Центральноевропейское летнее время), если предположить, что мероприятие начнется в 13:30.

Hugo Jiménez 03.06.2024 11:25

Пожалуйста, опубликуйте новый вопрос, указав более подробную информацию о вашем требовании, и поделитесь этой ссылкой здесь.

Sridevi 03.06.2024 11:29

Здесь у вас есть! stackoverflow.com/q/78569588/22658214

Hugo Jiménez 03.06.2024 12:01

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