顯示使用者檔案

已完成

在使用者可以下載檔案之前,我們需要顯示可用檔案的清單。 在此學習模組中,檔案會位於使用者的商務用 OneDrive 根目錄中。 您可以將一或兩個檔案拖放到該處以展開作業。 您可以瀏覽至 https://www.office.com/,並在登入後選取 OneDrive 圖示,以存取您的商務用 OneDrive 執行個體。

顯示檔案清單的螢幕擷取畫面。

決定您的應用程式所需的權限

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 根資料夾下載檔案清單的程式碼。

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 資料夾中的檔案,您必須尋找使用者的使用者識別碼及其 /Documents 資料夾的項目識別碼,然後存取 /users/{user-id}/drive/items/{item-id}/children

提示

Microsoft Graph 可讓您存取 OneDrive、商務用 OneDrive 和 SharePoint Online 中的檔案。 Microsoft Teams 和其他 Microsoft 365 服務會將檔案存放在商務用 OneDrive 和 SharePoint Online 中。 檔案作業相同,但每個服務的資源 (URL) 有些許不同。

此 GET 要求在 Microsoft Graph SDK 中表示如下:

const response = await graphClient
  .api('/me/drive/root/children')
  .get();

您可以指定所需的資料行,讓呼叫更有效率。 此工作可使用 REST 中的 $select= query 字串參數來處理 (根據 OData 標準)。 SDK 可藉由提供 select() 函數加以簡化。 請注意,這些函數可以鏈結,使要求更容易讀取。

const response = await graphClient
    .api('/me/drive/root/children')
    .select('id,name,folder,package')
    .get();

後續步驟

接下來,您可以練習以上學到的一切,並擴充您的應用程式,以顯示使用者的商務用 OneDrive 根資料夾中的檔案清單。