显示用户文件
在用户可以下载文件之前,我们需要显示可用文件的列表。 在此学习模块中,文件将位于用户的 OneDrive for Business 根目录中。 你可能想要将一两个文件放到该处启动。 可以通过浏览到 https://www.office.com/、登录和选择 OneDrive 图标来访问 OneDrive for Business 实例。
确定应用需要哪些权限
Microsoft Graph 公开的所有数据都受到保护。 应用需要获得适当的权限才能访问它。 所需的权限取决于应用需要访问的信息类型。 例如,若要访问用户的日历,应用需要具有 Calendars.Read
权限。 若要读取用户的文件,应用需要 Files.Read
权限。 稍后,当需要上传文件时,应用将需要 Files.ReadWrite
权限。 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);
}
}
其理念是应用程序在需要权限时才请求权限。 例如,下面是用于从用户 OneDrive for Business 根文件夹下载文件列表的代码。
async function getFiles() {
ensureScope('files.read');
try {
const response = await graphClient
.api('/me/drive/root/children')
.select('id,name,folder,package')
.get();
return response.value;
} catch (error) {
console.error(error);
}
}
对 ensureScope()
的调用可确保 files.read 权限包含在用于调用 Microsoft Graph 的访问令牌中。
Microsoft Graph SDK 负责使用 msalRequest
对象调用 Microsoft 身份验证库,而且它对每次 Microsoft Graph 调用都会执行此操作。 虽然此活动可能看起来很浪费,但却不是。 Microsoft 身份验证库会自动重复使用相同的访问令牌,直到旧访问令牌过期或权限范围更改。 在 graph.js顶部,可以看到设置此指令的代码。
const authProvider = {
getAccessToken: async () => {
return await getToken();
}
};
const graphClient = MicrosoftGraph.Client.initWithMiddleware({ authProvider });
首先,代码声明一个 authProvider
,这是一个包含 getAccessToken()
函数的 JSON 对象。 此函数调用 getToken()
,这是auth.js 文件中一个调用 Microsoft 身份验证库的的函数。 如果需要,可以进一步查看。
authProvider
对象将传递给 Microsoft SDK,它会在需要时调用getAccessToken()
,这样你的代码就不需要这么做。
使用 Microsoft Graph 检索用户 OneDrive 根目录中的文件
若要获取此文件列表,请使用 /me/drive/root/children
资源。 获取当前用户 OneDrive 根目录的根文件夹中的文件更容易,因为Microsoft Graph 提供 /me
和 /root
等快捷方式。 例如,若要枚举其他用户的 Documents 文件夹中的文件,需要查找用户的用户 ID 及其 /Documents 文件夹的项目 ID,然后访问 /users/{user-id}/drive/items/{item-id}/children
。
提示
Microsoft Graph 提供了对 OneDrive、OneDrive for Business 和 SharePoint Online 中的文件的访问权限。 Microsoft Teams 和其他 Microsoft 365 服务将文件存储在 OneDrive for Business 和 SharePoint Online 中。 文件操作相同,但每个服务的资源 (URL) 略有不同。
此 GET 请求在 Microsoft Graph SDK 中按以下方式表示:
const response = await graphClient
.api('/me/drive/root/children')
.get();
可以通过指定所需的数据列来提高调用的效率。 此任务通过使用 REST 中的 $select= query
字符串参数(基于 OData 标准)进行处理。 通过提供 select()
函数,SDK 使其变得更轻松。 请注意,可以链接函数,使请求易于阅读。
const response = await graphClient
.api('/me/drive/root/children')
.select('id,name,folder,package')
.get();
后续步骤
让我们练习所学到的内容并扩展应用,以显示用户 OneDrive for Business 根文件夹中的文件列表。