显示用户文件

已完成

在用户可以下载文件之前,我们需要显示可用文件的列表。 在此学习模块中,文件将位于用户的 OneDrive for Business 根目录中。 你可能想要将一两个文件放到该处启动。 可以通过浏览到 https://www.office.com/、登录和选择 OneDrive 图标来访问 OneDrive for Business 实例。

显示

确定应用需要哪些权限

Microsoft Graph 公开的所有数据都受到保护。 应用需要获得适当的权限才能访问它。 所需的权限取决于应用需要访问的信息类型。 例如,若要访问用户的日历,应用需要具有 Calendars.Read 权限。 若要读取用户的文件,应用需要 Files.Read 权限。 稍后,当需要上传文件时,应用将需要 Files.ReadWrite 权限。 Microsoft Graph API 引用中提供了每个操作所需的权限的确切列表。

如果应用加载不同类型的数据,则用户必须向其授予访问此信息所需的多个权限。 在应用中,仅请求所需的权限。 在此模块中,应用最初会请求读取文件的权限,并且仅在尝试上传文件时请求读取/写入权限。 此模式称为 动态许可,这是请求权限的建议方法。 使用动态许可,用户可以控制与其使用的应用共享的数据,从而最大程度地降低安全风险。

指定必要的权限

授予应用的权限列表将直接放入访问令牌中。 OAuth 标准将它们称为 范围。 当应用程序使用 Microsoft 身份验证库获取访问令牌时,它需要在向 Azure Active Directory 发送的请求中包含范围列表。 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 根文件夹中的文件列表。