我正在开发一个 Web 应用程序,用于读取已登录用户的 Microsoft 日历,我的问题是,使用 @hotmail 或 @outlook 帐户可以毫无问题地读取它们,但是当使用 @onmicrosoft 帐户时好像账号不存在,什么时候可以直接登录office365网站呢
在 Azure 门户中,我启用了登录功能:“任何组织目录中的帐户(任何 Microsoft ID 租户登录 - 多租户)和个人 Microsoft 帐户(例如 Skype、Xbox) 拥有工作或学校帐户或个人 Microsoft 帐户的任何人都可以使用该应用或 API。 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 帐户,您需要另一种类型的授权或委派/应用程序权限
非常感谢!
当您使用
/consumers
作为仅允许 Microsoft 帐户(@hotmail 或 @outlook)登录的 authority 时,会发生错误。
我通过选择“支持的帐户类型”注册了一个多租户应用程序,如下所示:
现在,我添加了 Delegate 类型的 API 权限并授予了他们同意:
当您以
/consumers
的权限运行代码并尝试使用后缀为onmicrosoft.com的本地帐户登录时,它会给出错误,如下所示:
将您的权限更改为
https://login.microsoftonline.com/common/
,允许用户同时使用个人帐户和后缀为 onmicrosoft.com 的本地帐户登录。
要解决该错误,请通过更改 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"]
};