Google 致力于为黑人社区推动种族平等。查看具体举措

在 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的实例。

    Web version 9

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

    Web version 8

    var provider = new firebase.auth.SAMLAuthProvider('saml.example-provider');
    ``
    
  1. 使用 SAML 提供程序对象向 Firebase 进行身份验证。

    您可以将用户重定向到提供商的登录页面或在弹出式浏览器窗口中打开登录页面。

    重定向流

    通过调用signInWithRedirect()重定向到提供者登录页面:

    Web version 9

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

    Web version 8

    firebase.auth().signInWithRedirect(provider);
    

    用户完成登录并返回您的应用后,您可以通过调用getRedirectResult()获取登录结果。

    Web version 9

    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 version 8

    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.
      });
    

    弹出流

    Web version 9

    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 version 8

    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.
      });
    
  2. 虽然上述示例侧重于登录流程,但您可以使用相同的模式使用linkWithRedirect()linkWithPopup()将 SAML 提供程序链接到现有用户,并使用 reauthenticateWithRedirect( reauthenticateWithRedirect()reauthenticateWithPopup() () 重新验证用户,可用于检索需要最近登录的敏感操作的新凭据。