Share via


單頁應用程式:取得令牌以呼叫 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