尝试读取 Office365 日历时出现问题

问题描述 投票:0回答:1

我正在开发一个 Web 应用程序,用于读取已登录用户的 Microsoft 日历,我的问题是,使用 @hotmail@outlook 帐户可以毫无问题地读取它们,但是当使用 @onmicrosoft 帐户时好像账号不存在,什么时候可以直接登录office365网站呢

在 Azure 门户中,我启用了登录功能:“任何组织目录中的帐户(任何 Microsoft ID 租户登录 - 多租户)和个人 Microsoft 帐户(例如 Skype、Xbox) 拥有工作或学校帐户或个人 Microsoft 帐户的任何人都可以使用该应用或 API。 Office 365 订阅者也包括在内。”如下图所示。

valid accounts

尝试登录时会出现:

login Error

翻译:此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 azure azure-active-directory calendar office365
1个回答
0
投票

当您使用

/consumers
作为仅允许 Microsoft 帐户(@hotmail@outlook)登录的 authority 时,会发生错误。

我通过选择“支持的帐户类型”注册了一个多租户应用程序,如下所示:

enter image description here

现在,我添加了 Delegate 类型的 API 权限并授予了他们同意:

enter image description here

当您以

/consumers
的权限运行代码并尝试使用后缀为onmicrosoft.com的本地帐户登录时,它会给出错误,如下所示:

enter image description here

将您的权限更改为

https://login.microsoftonline.com/common/
,允许用户同时使用个人帐户和后缀为 onmicrosoft.com 的本地帐户登录。

enter image description here

要解决该错误,请通过更改 msalConfig 中的

authority
参数值来修改这部分代码:

 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 身份平台

© www.soinside.com 2019 - 2024. All rights reserved.