Integrar o Firebase Authentication com um autenticador customizado envolve a criação de um sistema de autenticação personalizado que pode ser vinculado ao Firebase. Isso é útil quando você já tem um sistema de autenticação existente e deseja aproveitar os recursos do Firebase, como o Firebase Auth, para gerenciar usuários, tokens, e outras funcionalidades.
Link para a documentação do Firebase.
https://firebase.google.com/docs/auth/web/custom-auth?hl=pt-br
Aqui está um guia passo a passo para integrar o Firebase Auth com um autenticador customizado:
1. Configuração do Firebase
Primeiro, você precisa configurar o Firebase no seu projeto:
- Crie um projeto no Firebase Console: Acesse o Firebase Console e crie um novo projeto.
- Adicione o Firebase ao seu aplicativo: Siga as instruções para adicionar o Firebase ao seu aplicativo (Android, iOS, ou Web).
- Habilite o Firebase Authentication: No Firebase Console, vá para a seção “Authentication” e habilite o método de autenticação “Email/Senha” ou qualquer outro método que você deseja usar.
2. Criar um Autenticador Customizado
Você precisará criar um servidor (ou endpoint) que atue como um autenticador customizado. Esse servidor será responsável por validar as credenciais do usuário e gerar um token customizado que será usado pelo Firebase.
Exemplo de Servidor (Node.js/Express):
const express = require('express');
const jwt = require('jsonwebtoken');
const admin = require('firebase-admin');
const app = express();
app.use(express.json());
// Inicialize o Firebase Admin SDK
const serviceAccount = require('path/to/serviceAccountKey.json');
admin.initializeApp({
credential: admin.credential.cert(serviceAccount)
});
// Endpoint para autenticação customizada
app.post('/custom-auth', (req, res) => {
const { username, password } = req.body;
// Valide as credenciais do usuário (isso depende do seu sistema)
if (username === 'user' && password === 'password') {
// Crie um token customizado
const uid = 'some-uid'; // ID único do usuário no seu sistema
const additionalClaims = {
premiumAccount: true
};
admin.auth().createCustomToken(uid, additionalClaims)
.then((customToken) => {
res.json({ token: customToken });
})
.catch((error) => {
res.status(500).json({ error: 'Erro ao criar token customizado' });
});
} else {
res.status(401).json({ error: 'Credenciais inválidas' });
}
});
app.listen(3000, () => {
console.log('Servidor rodando na porta 3000');
});
3. Autenticar no Firebase com o Token Customizado
No seu aplicativo cliente, você precisará autenticar o usuário usando o token customizado gerado pelo seu servidor.
Exemplo de Autenticação no Cliente (JavaScript):
import { getAuth, signInWithCustomToken } from "firebase/auth";
// Função para autenticar o usuário
async function authenticateUser(username, password) {
try {
// Chame o endpoint do seu servidor para obter o token customizado
const response = await fetch('https://your-server.com/custom-auth', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({ username, password }),
});
const data = await response.json();
if (data.token) {
const auth = getAuth();
const userCredential = await signInWithCustomToken(auth, data.token);
console.log('Usuário autenticado:', userCredential.user);
} else {
console.error('Erro ao autenticar:', data.error);
}
} catch (error) {
console.error('Erro ao autenticar:', error);
}
}
// Exemplo de uso
authenticateUser('user', 'password');
4. Gerenciar Usuários no Firebase
Com o token customizado, o Firebase Auth criará ou autenticará um usuário com o UID fornecido. Você pode gerenciar esses usuários no Firebase Console e usar outras funcionalidades do Firebase, como Firestore, Realtime Database, etc.
5. Segurança e Boas Práticas
- Proteja seu endpoint de autenticação: Certifique-se de que o endpoint que gera o token customizado esteja protegido contra ataques.
- Use HTTPS: Sempre use HTTPS para comunicação entre o cliente e o servidor.
- Valide credenciais com cuidado: Certifique-se de que a validação de credenciais no seu servidor seja segura e robusta.
Mas você pode se perguntar:
Como esse usuário é armazenado no Firebase Auth?
Quando você usa um custom token para autenticar um usuário no Firebase Authentication, esse usuário é criado e armazenado no Firebase, desde que a autenticação seja bem-sucedida. Abaixo os detalhes de como isso funciona:
1. O usuário é criado no Firebase Authentication
Quando você chama a função signInWithCustomToken
no cliente (ou usa o token customizado em outras plataformas, como Android ou iOS), o Firebase verifica o token. Se o token for válido, o Firebase cria um novo usuário no sistema de autenticação com o UID especificado no token.
- Esse usuário é armazenado no Firebase Authentication.
- Você pode visualizá-lo no Firebase Console, na seção Authentication > Users.
2. O UID é o identificador único
O UID que você passa ao criar o token customizado (no servidor) será o identificador único do usuário no Firebase Authentication. Por exemplo:
admin.auth().createCustomToken('custom-uid-123', { premiumAccount: true });
- O usuário será criado com o UID
custom-uid-123
. - Se um usuário com esse UID já existir, o Firebase simplesmente autenticará o usuário existente.
3. O usuário não tem email/senha ou provedores externos
Um usuário autenticado com um custom token é tratado como um usuário “customizado” no Firebase. Isso significa:
- Ele não está associado a um email/senha, Google, Facebook, ou qualquer outro provedor de autenticação.
- Ele só pode ser autenticado novamente usando um custom token gerado pelo seu servidor.
4. Persistência do usuário
O usuário criado com o custom token permanece no Firebase Authentication até que você o exclua manualmente (por exemplo, usando o Firebase Console ou a Admin SDK).
- Você pode gerenciar esses usuários como qualquer outro usuário do Firebase.
- Eles podem ser associados a dados no Firestore, Realtime Database, ou outros serviços do Firebase.
5. Exemplo de Gerenciamento de Usuários
Aqui está um exemplo de como você pode gerenciar usuários criados com custom tokens usando a Firebase Admin SDK:
Listar todos os usuários:
admin.auth().listUsers()
.then((userRecords) => {
userRecords.users.forEach((user) => {
console.log('Usuário:', user.uid, user.providerData);
});
})
.catch((error) => {
console.error('Erro ao listar usuários:', error);
});
Excluir um usuário:
admin.auth().deleteUser('custom-uid-123')
.then(() => {
console.log('Usuário excluído com sucesso');
})
.catch((error) => {
console.error('Erro ao excluir usuário:', error);
});
6. Token de ID e Refresh Token
Quando o usuário é autenticado com sucesso usando o custom token, o Firebase gera:
- Um ID Token: Um token JWT que pode ser usado para autenticar solicitações ao seu backend ou serviços do Firebase.
- Um Refresh Token: Usado para obter novos ID Tokens quando o atual expira.
Esses tokens são gerenciados pelo Firebase SDK no cliente e podem ser usados para manter o usuário autenticado.
7. Limitações
- Custom tokens expiram: Por padrão, um custom token expira após 1 hora. Após isso, o usuário precisará autenticar novamente.
- Sem provedores externos: Como mencionado, o usuário não está associado a provedores como Google, Facebook, etc. Se você quiser adicionar provedores externos, precisará vincular manualmente (usando a Admin SDK).
Vincular esse usuário customizado a um usuário o Firebase Auth
Para vincular um usuário customizado (autenticado com um custom token) a um usuário existente do Firebase Auth. Isso é útil quando você deseja permitir que um usuário autenticado com um método personalizado (como um sistema de autenticação próprio) também possa usar outros provedores de autenticação do Firebase, como email/senha, Google, Facebook, etc.
Aqui está como você pode fazer isso:
1. O que é Linking (Vinculação)?
O Firebase Auth permite vincular múltiplos provedores de autenticação a uma única conta de usuário. Por exemplo, um usuário pode se autenticar com um custom token e depois vincular uma conta do Google ou email/senha à mesma conta.
2. Pré-requisitos
- O usuário já deve estar autenticado no Firebase (por exemplo, usando um custom token).
- O provedor que você deseja vincular (como email/senha, Google, etc.) deve estar habilitado no Firebase Console.
3. Como Vincular um Provedor a um Usuário Customizado
Passo 1: Autentique o Usuário com o Custom Token
Primeiro, o usuário precisa estar autenticado com o custom token:
import { getAuth, signInWithCustomToken } from 'firebase/auth';
const auth = getAuth();
// Autentique o usuário com o custom token
const customToken = 'SEU_CUSTOM_TOKEN_AQUI'; // Token gerado pelo servidor
signInWithCustomToken(auth, customToken)
.then((userCredential) => {
console.log('Usuário autenticado:', userCredential.user);
})
.catch((error) => {
console.error('Erro ao autenticar:', error);
});
Passo 2: Vincule um Provedor ao Usuário
Depois que o usuário estiver autenticado, você pode vincular outro provedor (por exemplo, email/senha ou Google) à conta dele.
Exemplo: Vincular Email/Senha
import { getAuth, linkWithCredential, EmailAuthProvider } from 'firebase/auth';
const auth = getAuth();
const user = auth.currentUser;
// Crie uma credencial de email/senha
const email = 'usuario@exemplo.com';
const password = 'senhaSegura123';
const credential = EmailAuthProvider.credential(email, password);
// Vincule a credencial ao usuário
linkWithCredential(user, credential)
.then((userCredential) => {
console.log('Provedor vinculado com sucesso:', userCredential.user);
})
.catch((error) => {
console.error('Erro ao vincular provedor:', error);
});
Exemplo: Vincular Conta do Google
import { getAuth, linkWithPopup, GoogleAuthProvider } from 'firebase/auth';
const auth = getAuth();
const user = auth.currentUser;
// Inicie o processo de vinculação com o Google
const provider = new GoogleAuthProvider();
linkWithPopup(user, provider)
.then((result) => {
console.log('Conta do Google vinculada com sucesso:', result.user);
})
.catch((error) => {
console.error('Erro ao vincular conta do Google:', error);
});
4. Gerenciando Usuários Vinculados
Depois de vincular um provedor, o usuário poderá se autenticar com qualquer um dos métodos vinculados. Você pode verificar os provedores vinculados a uma conta usando o método fetchSignInMethodsForEmail
ou acessando a propriedade providerData
do objeto User
.
Exemplo: Verificar Provedores Vinculados
const auth = getAuth();
const user = auth.currentUser;
if (user) {
console.log('Provedores vinculados:');
user.providerData.forEach((profile) => {
console.log('Provedor:', profile.providerId);
});
}
5. Desvincular um Provedor
Se você quiser remover um provedor vinculado, use o método unlink
.
Exemplo: Desvincular Email/Senha
const auth = getAuth();
const user = auth.currentUser;
user.unlink(EmailAuthProvider.PROVIDER_ID)
.then(() => {
console.log('Provedor desvinculado com sucesso.');
})
.catch((error) => {
console.error('Erro ao desvincular provedor:', error);
});
6. Considerações Importantes
- UID Único: O UID do usuário permanece o mesmo, independentemente dos provedores vinculados.
- Erros Comuns:
- Se o email já estiver associado a outra conta do Firebase, você receberá um erro. Nesse caso, pode ser necessário mesclar as contas.
- Certifique-se de que o provedor que você deseja vincular esteja habilitado no Firebase Console.
- Claims Personalizados: Se você estiver usando claims personalizados, eles serão mantidos após a vinculação.
7. Exemplo Completo: Autenticar com Custom Token e Vincular Email/Senha
Aqui está um exemplo completo:
import { getAuth, signInWithCustomToken, linkWithCredential, EmailAuthProvider } from 'firebase/auth';
const auth = getAuth();
// 1. Autentique o usuário com o custom token
const customToken = 'SEU_CUSTOM_TOKEN_AQUI';
signInWithCustomToken(auth, customToken)
.then((userCredential) => {
console.log('Usuário autenticado:', userCredential.user);
// 2. Vincule email/senha à conta
const email = 'usuario@exemplo.com';
const password = 'senhaSegura123';
const credential = EmailAuthProvider.credential(email, password);
return linkWithCredential(userCredential.user, credential);
})
.then((userCredential) => {
console.log('Email/senha vinculado com sucesso:', userCredential.user);
})
.catch((error) => {
console.error('Erro:', error);
});
Resumo
- Você pode vincular um usuário autenticado com um custom token a outros provedores do Firebase (como email/senha, Google, etc.).
- Use
linkWithCredential
oulinkWithPopup
para vincular provedores. - O UID do usuário permanece o mesmo, e todos os provedores vinculados compartilham a mesma conta.