在 Web 應用程式中使用 SAML 進行身份驗證

如果您已升級到使用 Identity Platform 進行 Firebase 身份驗證,則可以使用您選擇的 SAML 身份提供商通過 Firebase 對用戶進行身份驗證。這使得您可以使用基於 SAML 的 SSO 解決方案將用戶登錄到您的 Firebase 應用。

Firebase 身份驗證僅支持服務提供商發起的 SAML 流。

在你開始之前

要使用 SAML 身份提供商登錄用戶,您必須首先從提供商收集一些信息:

  • 提供者的實體 ID :標識身份提供者的 URI。
  • 提供商的 SAML SSO URL :身份提供商登錄頁面的 URL。
  • 提供者的公鑰證書:用於驗證身份提供者簽名的令牌的證書。
  • 您的應用程序的實體 ID :標識您的應用程序(“服務提供商”)的 URI。

獲得上述信息後,啟用 SAML 作為您的 Firebase 項目的登錄提供程序:

  1. 將 Firebase 添加到您的 JavaScript 項目

  2. 如果您尚未升級到帶有 Identity Platform 的 Firebase 身份驗證,請升級。 SAML 身份驗證僅在升級的項目中可用。

  3. 在 Firebase 控制台的登錄提供商頁面上,單擊添加新提供商,然後單擊SAML

  4. 為該提供者指定一個名稱。請注意生成的提供程序 ID:類似於saml.example-provider 。當您向應用添加登錄代碼時,您將需要此 ID。

  5. 指定您的身份提供商的實體 ID、SSO URL 和公鑰證書。還要指定您的應用程序(服務提供商)的實體 ID。這些值必須與您的提供商分配給您的值完全匹配。

  6. 保存您的更改。

  7. 如果您尚未授權應用的域,請將其添加到 Firebase 控制台的“身份驗證”>“設置”頁面上的允許列表中。

使用 Firebase SDK 處理登錄流程

要使用 Firebase JavaScript SDK 處理登錄流程,請按照以下步驟操作:

  1. 使用您在 Firebase 控制台中獲取的提供商 ID 創建SAMLAuthProvider的實例。

    網絡模塊化API

    import { SAMLAuthProvider } from "firebase/auth";
    
    const provider = new SAMLAuthProvider('saml.example-provider');
    

    Web 命名空間 API

    var provider = new firebase.auth.SAMLAuthProvider('saml.example-provider');
    ``
    
  1. 使用 SAML 提供程序對象通過 Firebase 進行身份驗證。

    您可以將用戶重定向到提供商的登錄頁面,也可以在彈出的瀏覽器窗口中打開登錄頁面。

    重定向流程

    通過調用signInWithRedirect()重定向到提供者登錄頁面:

    網絡模塊化API

    import { getAuth, signInWithRedirect } from "firebase/auth";
    
    const auth = getAuth();
    signInWithRedirect(auth, provider);
    

    Web 命名空間 API

    firebase.auth().signInWithRedirect(provider);
    

    用戶完成登錄並返回應用後,您可以通過調用getRedirectResult()獲取登錄結果。

    網絡模塊化API

    import { getAuth, getRedirectResult, SAMLAuthProvider } from "firebase/auth";
    
    const auth = getAuth();
    getRedirectResult(auth)
      .then((result) => {
        // User is signed in.
    
        // Provider data available using getAdditionalUserInfo()
      })
      .catch((error) => {
        // Handle error.
      });
    

    Web 命名空間 API

    firebase.auth().getRedirectResult()
      .then((result) => {
        // User is signed in.
    
        // Provider data available in result.additionalUserInfo.profile,
        // or from the user's ID token obtained from result.user.getIdToken()
        // as an object in the firebase.sign_in_attributes custom claim.
      })
      .catch((error) => {
        // Handle error.
      });
    

    彈出流程

    網絡模塊化API

    import { getAuth, signInWithPopup, OAuthProvider } from "firebase/auth";
    
    const auth = getAuth();
    signInWithPopup(auth, provider)
      .then((result) => {
        // User is signed in.
    
        // Provider data available in result.additionalUserInfo.profile,
        // or from the user's ID token obtained from result.user.getIdToken()
        // as an object in the firebase.sign_in_attributes custom claim.
      })
      .catch((error) => {
        // Handle error.
      });
    

    Web 命名空間 API

    firebase.auth().signInWithPopup(provider)
      .then((result) => {
        // User is signed in.
    
        // Provider data available in result.additionalUserInfo.profile,
        // or from the user's ID token obtained from result.user.getIdToken()
        // as an object in the firebase.sign_in_attributes custom claim.
      })
      .catch((error) => {
        // Handle error.
      });
    

    僅當身份提供商的 SAML 斷言的NameID屬性中提供了用戶的電子郵件地址時,ID 令牌和UserInfo對象才包含用戶的電子郵件地址:

    <Subject>
      <NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress">test@email.com</NameID>
    </Subject>
    
  2. 雖然上面的示例重點介紹登錄流程,但您可以使用相同的模式使用linkWithRedirect()linkWithPopup()將 SAML 提供程序鏈接到現有用戶,並使用reauthenticateWithRedirect()reauthenticateWithPopup()重新驗證用戶身份,它可用於檢索需要最近登錄的敏感操作的新憑據。