使用 Microsoft Graph 访问用户的日历事件
在本单元中,将了解如何显示未来一周的用户日历事件。 还将了解如何在给定时间段内 查询 数据事件,并使用 选择 和 顺序 等概念按照希望的方式显示所需的信息。
确定应用需要哪些权限
Microsoft Graph 公开的所有数据都受到保护。 你的应用必须有权访问它。 所需的权限取决于应用需要访问的信息类型。 例如,若要访问用户的日历,你的应用需要具有 Calendars.Read 权限。 Microsoft Graph API 引用中提供了每个操作所需的权限的确切列表。
如果应用加载不同类型的数据,则用户必须向其授予访问此信息所需的多个权限。 在应用中,仅请求所需的权限。 在本模块中,你的应用最初请求读取用户名的权限,并且仅在你选择显示事件的按钮时才请求读取其日历。 此模式称为 动态许可,这是请求权限的建议方法。 使用动态许可,用户可以控制与其使用的应用共享的数据,从而最大程度地降低安全风险。
指定必要的权限
授予应用的权限列表将直接放入访问令牌中。 OAuth 标准将它们称为 范围。 当应用程序使用Microsoft身份验证库获取访问令牌时,它需要在请求中包含范围列表,以Microsoft Entra ID。 Microsoft Graph 中的每个操作都有其自己的范围列表。 如果访问令牌中没有其中一个令牌,请求将被拒绝。
示例应用程序将当前 Microsoft 身份验证库请求存储在名为 msalRequest的全局变量中。 最初,它包含一个空的范围数组。
const msalRequest = { scopes: [] };
下面是示例应用程序用于向请求添加更多范围的帮助程序函数。
function ensureScope (scope) {
if (!msalRequest.scopes.some((s) => s.toLowerCase() === scope.toLowerCase())) {
msalRequest.scopes.push(scope);
}
}
调用 Microsoft Graph 检索数据时,请通过调用帮助函数来确保包含必要的权限。
async function getEvents() {
ensureScope('Calendars.read');
// ...
}
检索给定时间段内用户的日历事件
若要从 Microsoft Graph 获取用户的日历事件,请调用 /me/calendarview 终结点,如前所述。 它从已登录用户的默认日历返回日历事件的匹配项和单个实例的列表。 可以使用 Microsoft Graph SDK 调用Microsoft Graph 终结点,指定要执行的终结点和请求类型。
若要仅显示下周的日历事件,请使用以下查询传递结果的时间范围:
graphClient
.api('/me/calendarview')
.query(`startDateTime=${dateNow.toISOString()}&endDateTime=${dateNextWeek.toISOString()}`);
在这里, dateNow 是当前日期, dateNextWeek 是在当前日期的基础上增加 7 天,以获取一周的时间段。
将 Microsoft Graph 检索和传输的数据量降至最低,可显著提高应用的性能。 在应用使用的结果中,select方法可用于选择特定属性。 要返回的属性将以逗号分隔列表的形式传递给 select:
graphClient
.api('/me/calendarview')
.query(` startDateTime=${dateNow.toISOString()}&endDateTime=${dateNextWeek.toISOString()} `)
.select('subject,start,end');
使用 orderby 方法指定如何对结果中的项进行排序。 若要按多个字段排序,请指定一个以逗号分隔的字段列表。 也可通过向查询附加 asc 或 desc 关键字,指定按升序还是降序对项进行排序。
在此应用中,按 "开始" 字段,按升序对数据进行排序。 如果未指定关键字 (如 asc 或 desc),则此顺序为默认顺序:
graphClient
.api('/me/calendarview')
.query(` startDateTime=${dateNow.toISOString()}&endDateTime=${dateNextWeek.toISOString()} `)
.select('subject,start,end')
.orderby('Start/DateTime');
下面是最终 Microsoft Graph 调用的外观。
graphClient
.api('/me/calendarview')
.query(` startDateTime=${dateNow.toISOString()}&endDateTime=${dateNextWeek.toISOString()} `)
.select('subject,start,end')
.orderby('Start/DateTime')
.get();