共用方式為


單一頁面應用程式:取得權杖以呼叫 API

使用 MSAL.js 為 API 取得權杖的模式是先使用 acquireTokenSilent 方法嘗試無訊息的權杖要求。 呼叫此方法時,程式庫會先檢查瀏覽器儲存體中的快取,以查看是否存在尚未過期的存取權杖並將其傳回。 如果找不到任何存取權杖或找到的存取權杖已過期,它會嘗試使用其重新整理權杖來取得全新的存取權杖。 如果重新整理權杖的 24 小時存留期也已過期,MSAL.js 會開啟隱藏的 iframe,利用現有的作用中工作階段搭配 Microsoft Entra ID (如果有的話),接著針對一組全新權杖 (存取權「和」重新整理權杖) 進行交換,以無訊息方式要求新的授權碼。 如需 Microsoft Entra ID 中單一登入 (SSO) 工作階段和權杖存留期值的詳細資訊,請參閱權杖存留期。 如需 MSAL.js 快取查閱原則的詳細資訊,請參閱:取得存取權杖 \(英文\)。

由於密碼變更或更新的條件式存取原則等原因,Microsoft Entra ID 的無訊息權杖要求可能會失敗。 失敗的原因通常是重新整理權杖的 24 小時存留期即將到期,而瀏覽器會封鎖第三方 Cookie,以防止使用隱藏的 iframe 繼續驗證使用者。 在這些情況下,您應該叫用其中一個互動式方法 (這可能會提示使用者) 以取得權杖:

選擇快顯或重新導向體驗

快顯或重新導向體驗的選擇取決於您的應用程式流程:

  • 如果您不想讓使用者在驗證期間離開主要的應用程式頁面,建議您採用快顯方法。 由於驗證重新導向會發生在快顯視窗,因此主要應用程式的狀態會保留。

  • 如果使用者有瀏覽器限制式,或已停用快顯視窗的原則,您可以使用重新導向方法。 針對 Internet Explorer 瀏覽器請使用重新導向方法,因為 Internet Explorer 上的快顯視窗有已知問題

您可以設定存取權杖在建立存取權杖要求時要包含的 API 範圍。 存取權杖中要求的範圍可能不會全部獲得授權。 這取決於使用者同意。

使用快顯視窗取得權杖

下列程式碼結合了先前描述的模式與快顯體驗的方法:

// MSAL.js v2 exposes several account APIs, logic to determine which account to use is the responsibility of the developer
const account = publicClientApplication.getAllAccounts()[0];

const accessTokenRequest = {
  scopes: ["user.read"],
  account: account,
};

publicClientApplication
  .acquireTokenSilent(accessTokenRequest)
  .then(function (accessTokenResponse) {
    // Acquire token silent success
    let accessToken = accessTokenResponse.accessToken;
    // Call your API with token
    callApi(accessToken);
  })
  .catch(function (error) {
    //Acquire token silent failure, and send an interactive request
    if (error instanceof InteractionRequiredAuthError) {
      publicClientApplication
        .acquireTokenPopup(accessTokenRequest)
        .then(function (accessTokenResponse) {
          // Acquire token interactive success
          let accessToken = accessTokenResponse.accessToken;
          // Call your API with token
          callApi(accessToken);
        })
        .catch(function (error) {
          // Acquire token interactive failure
          console.log(error);
        });
    }
    console.log(error);
  });

使用重新導向取得權杖

以下是稍早所述的模式,但會顯示以互動方式取得權杖的重新導向方法。 您必須在頁面載入時呼叫和等待 handleRedirectPromise

const redirectResponse = await publicClientApplication.handleRedirectPromise();
if (redirectResponse !== null) {
  // Acquire token silent success
  let accessToken = redirectResponse.accessToken;
  // Call your API with token
  callApi(accessToken);
} else {
  // MSAL.js v2 exposes several account APIs, logic to determine which account to use is the responsibility of the developer
  const account = publicClientApplication.getAllAccounts()[0];

  const accessTokenRequest = {
    scopes: ["user.read"],
    account: account,
  };

  publicClientApplication
    .acquireTokenSilent(accessTokenRequest)
    .then(function (accessTokenResponse) {
      // Acquire token silent success
      // Call API with token
      let accessToken = accessTokenResponse.accessToken;
      // Call your API with token
      callApi(accessToken);
    })
    .catch(function (error) {
      //Acquire token silent failure, and send an interactive request
      console.log(error);
      if (error instanceof InteractionRequiredAuthError) {
        publicClientApplication.acquireTokenRedirect(accessTokenRequest);
      }
    });
}

下一步

繼續本案例的下一篇文章:呼叫 Web API