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
- Faça login na sua Google Cloud conta do. Se você começou a usar o Google Cloud, crie uma conta para avaliar o desempenho dos nossos produtos em situações reais. Clientes novos também recebem US $300 em créditos para executar, testar e implantar cargas de trabalho.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
- Ative o Identity Platform e adicione o SDK do cliente ao seu app. Para mais informações e instruções, consulte o Guia de início rápido Fazer login de um usuário com um e-mail usando o Identity Platform.
Configure o provedor
No Google Cloud console, acesse a página Identity Platform > Provedores de identidade.
Acessar provedores de identidadeClique em Adicionar um provedor e selecione SAML na lista.
Digite os seguintes detalhes:
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).O ID da entidade do provedor.
O URL de SSO SAML do provedor.
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-----
Na seção Provedor de serviços , insira o ID da entidade do seu app. Normalmente, esse é o URL do seu aplicativo. No seu provedor de identidade SAML, isso é chamado de público.
No painel lateral Configurações do projeto, clique em Adicionar domínio e adicione o domínio do seu app. Por exemplo, se o URL de login do seu aplicativo for
https://example.com/login, adicioneexample.com.Para concluir a configuração, faça uma destas ações:
Copie o URL de callback de autorização padrão do campo Callback de autorização (URL) e adicione-o à configuração do app SAML.
O uso do URL de callback de autorização padrão reduz a complexidade de validar a resposta SAML.
Adicione o URL de callback de autorização personalizado à configuração do app SAML. Por exemplo,
https://PROJECT-ID.firebaseapp.com/__/auth/handler.
Na seção Configurar seu aplicativo, clique em Detalhes de configuração. Copie o snippet no código do aplicativo para inicializar o SDK do cliente do Identity Platform.
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.
Assinar 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 Google Cloud projetoprovider-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 Google Cloud console ou a Google Cloud CLI.
A resposta é um
InboundSamlConfig
objeto, 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.
Fazer login de 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:
Crie uma instância
SAMLAuthProvidercom o ID do provedor configurado na seção anterior. O ID do provedor precisa começar comsaml.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');
Inicie o fluxo de login. É possível usar um pop-up ou um redirecionamento.
Pop-up
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 para 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 ver 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. // ... });
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
NameIDda 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>Ele é preenchido no token de ID emitido pelo Firebase e no objeto UserInfo.
Apenas os fluxos SAML iniciados pelo provedor de serviços a partir do SDK do cliente são compatíveis.
Vincular contas de usuário
Se um usuário já tiver feito login no seu app usando um método diferente (como e-mail/senha),
você poderá vincular a conta dele ao
provedor de SAML usando linkWithPopup() ou linkWithRedirect().
O snippet de código a seguir mostra como vincular uma Conta do Google de um usuário ao provedor SAML:
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
- Como fazer login de usuários com OIDC
- Como mostrar um domínio personalizado durante o login
- Como gerenciar provedores OIDC e SAML de maneira programática