Como fazer login de usuários com SAML

Neste documento, você verá como usar o Identity Platform para fazer login dos usuários com um provedor de Linguagem de marcação para autorização de segurança (SAML, na sigla em inglês) 2.0.

Antes de começar

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  5. Make sure that billing is enabled for your Google Cloud project.

  6. Ative o Identity Platform e adicione o SDK do cliente ao seu app. Veja o Guia de início rápido para saber como.

Como configurar o provedor

  1. Acesse a página Provedores de identidade no console do Google Cloud.
    Acessar a página "Provedores do Identity Platform"

  2. Clique em Adicionar um provedor e selecione SAML na lista.

  3. Digite os seguintes detalhes:

    1. O Nome do provedor. Ele pode ser igual ao ID do provedor ou um nome personalizado. Se você inserir um nome personalizado, clique em Editar ao lado de ID do provedor para especificar o ID (que precisa começar com saml.).

    2. O ID da entidade do provedor.

    3. O URL de SSO SAML do provedor.

    4. O certificado usado para assinar o token no provedor. Certifique-se de incluir as strings de início e término. Exemplo:

      -----BEGIN CERTIFICATE-----
      MIICajCCAdOgAwIBAgIBADANBgkqhkiG9w0BAQ0FADBSMQswCQYDVQQGEwJ1czEL
      ...
      LEzc1JwEGQQVDYQCwsQMSBDAF0QAB0w9GikhqkgBNADABIgABIwAgOdACCjaCIIM
      -----END CERTIFICATE-----
      
  4. Em Provedor de serviços, insira o ID da entidade do seu aplicativo. Normalmente, esse é o URL do seu aplicativo. No seu provedor de identidade SAML, isso é chamado de público.

  5. Adicione seu app à lista de Domínios autorizados. Por exemplo, se o URL de login do seu aplicativo for https://example.com/login, adicione example.com.

  6. Se necessário, personalize o URL de callback para seu app. Ele é comumente chamado de URL do serviço de declaração do consumidor (ACS, na sigla em inglês) por provedores de identidade SAML.

    O uso do URL de callback padrão reduz a complexidade de validar a resposta SAML. Se você personalizar esse fluxo, verifique se o URL de callback do Identity Platform do projeto está configurado no provedor de identidade SAML. Geralmente, isso é algo como https://[PROJECT-ID].firebaseapp.com/__/auth/handler. Consulte Como personalizar um gerenciador de autenticação para saber mais.

  7. Clique em Salvar.

Elementos obrigatórios do provedor

O Identity Platform espera os elementos <saml:Subject> e <saml:NameID> nas respostas do provedor. Se você não definir valores para esses elementos ao configurar o provedor, a declaração SAML vai falhar.

Como assinar as solicitações

É possível aumentar a segurança das suas solicitações de autenticação ao assiná-las.

Para assinar as solicitações, primeiro ative as solicitações assinadas para seu provedor de identidade. Para fazer isso, chame inboundSamlConfigs.patch() e defina idp_config.sign_request como true:

REST

Antes de usar os dados da solicitação abaixo, faça as substituições a seguir:

  • project-id: o ID do projeto do Google Cloud.
  • provider-id: o ID do provedor SAML

Método HTTP e URL:

PATCH https://identitytoolkit.googleapis.com/admin/v2/projects/project-id/inboundSamlConfigs/provider-id?updateMask=idpConfig.signRequest

Corpo JSON da solicitação:

{
  "idp_config": {
    "sign_request": true
  }
}

Para enviar a solicitação, expanda uma destas opções:

 

Use a API REST para ativar as solicitações assinadas. Não é possível fazer isso com o Console do Google Cloud ou a CLI do Google Cloud.

A resposta é um objeto InboundSamlConfig, que inclui uma matriz de SpCertificate. Configure o valor do certificado X509 com seu provedor de identidade SAML para que ele possa validar a assinatura das suas solicitações.

Como conectar usuários

Quando você faz login de um usuário, o SDK do cliente manipula o handshake de autenticação e, em seguida, retorna tokens de ID contendo os atributos SAML nos payloads deles. Para fazer login de um usuário e receber atributos do provedor de SAML:

  1. Crie uma instância SAMLAuthProvider com o ID do provedor configurado na seção anterior. O ID do provedor precisa começar com saml..

    Versão 9 para a Web

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

    Versão 8 para a Web

    const provider = new firebase.auth.SAMLAuthProvider('saml.myProvider');
  2. Inicie o fluxo de login. É possível usar um pop-up ou um redirecionamento.

    Versão 9 para a Web

    import { getAuth, signInWithPopup, SAMLAuthProvider } from "firebase/auth";
    
    const auth = getAuth();
    signInWithPopup(auth, provider)
      .then((result) => {
        // User is signed in.
        // Provider data available from the result.user.getIdToken()
        // or from result.user.providerData
      }).catch((error) => {
        // Handle Errors here.
        const errorCode = error.code;
        const errorMessage = error.message;
        // The email of the user's account used.
        const email = error.customData.email;
        // The AuthCredential type that was used.
        const credential = SAMLAuthProvider.credentialFromError(error);
        // Handle / display error.
        // ...
      });

    Versão 8 para a Web

    firebase.auth().signInWithPopup(provider)
      .then((result) => {
        // User is signed in.
        // Identity 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
        // This is also available from result.user.getIdTokenResult()
        // idTokenResult.claims.firebase.sign_in_attributes.
      })
      .catch((error) => {
        // Handle / display error.
        // ...
      });

    Redirecionamento

    Para redirecionar a uma página de login, chame signInWithRedirect():

    Versão 9 para a Web

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

    Versão 8 para a Web

    firebase.auth().signInWithRedirect(provider);

    Em seguida, chame getRedirectResult() para receber os resultados quando o usuário retornar ao app:

    Versão 9 para a Web

    import { getAuth, getRedirectResult, SAMLAuthProvider } from "firebase/auth";
    
    const auth = getAuth();
    getRedirectResult(auth)
      .then((result) => {
        // User is signed in.
        // Provider data available from the result.user.getIdToken()
        // or from result.user.providerData
      })
      .catch((error) => {
        // Handle Errors here.
        const errorCode = error.code;
        const errorMessage = error.message;
        // The email of the user's account used.
        const email = error.customData.email;
        // The AuthCredential type that was used.
        const credential = SAMLAuthProvider.credentialFromError(error);
        // Handle / display error.
        // ...
      });

    Versão 8 para a Web

    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
        // This is also available from result.user.getIdTokenResult()
        // idTokenResult.claims.firebase.sign_in_attributes.
      }).catch((error) => {
        // Handle / display error.
        // ...
      });
  3. Recupere os atributos de usuário associados ao provedor SAML do token de ID usando a declaração firebase.sign_in_attributes. Verifique o token de ID usando o SDK Admin ao enviá-lo para seu servidor.

    O token de ID inclui o endereço de e-mail do usuário apenas se ele for fornecido no atributo NameID da declaração SAML do provedor de identidade:

    <Subject>
      <NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress">test@email.com</NameID>
    </Subject>
    

    Esses dados são preenchidos no token ID emitido pelo Firebase e no objeto UserInfo.

Atualmente, apenas os fluxos SAML iniciados pelo provedor de serviços a partir do SDK do cliente são compatíveis.

Como vincular contas de usuário

Se um usuário já tiver feito login no app com outro método (como e-mail/senha), você poderá vincular a conta dele ao provedor de SAML usando linkWithPopup() ou linkWithRedirect(): Por exemplo, podemos vincular com uma Conta do Google:

Versão 9 para a Web

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

const auth = getAuth();
linkWithPopup(auth.currentUser, provider).then((result) => {
  // Accounts successfully linked.
  const credential = GoogleAuthProvider.credentialFromResult(result);
  const user = result.user;
  // ...
}).catch((error) => {
  // Handle Errors here.
  // ...
});

Versão 8 para a Web

auth.currentUser.linkWithPopup(provider).then((result) => {
  // Accounts successfully linked.
  var credential = result.credential;
  var user = result.user;
  // ...
}).catch((error) => {
  // Handle Errors here.
  // ...
});

A seguir