Autenticacao
O GoConverso usa o Supabase Auth para toda a autenticacao. Isso oferece sessoes baseadas em JWT, multiplos provedores OAuth e acesso seguro com controle por linha aos seus dados.
Metodos de autenticacao
O GoConverso suporta os seguintes metodos de autenticacao:
| Metodo | Descricao | Ideal para |
|---|---|---|
| Email e Senha | Cadastro e login tradicionais | A maioria dos usuarios |
| Google OAuth | Login com um clique pelo Google | Onboarding rapido |
| OTP (Senha de Uso Unico) | Link magico ou codigo de 6 digitos por email | Acesso ao portal do cliente |
| Chave de API + JWT | Acesso programatico | Integracoes servidor-a-servidor |
Chaves de API
Todo projeto GoConverso possui duas chaves de API:
Chave anon (publica)
A chave anon e segura para uso em codigo do lado do cliente. Ela respeita as politicas de Row Level Security, ou seja, os usuarios so podem acessar dados que estao autorizados a ver.
apikey: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...Chave service role (secreta)
A chave service role ignora todas as politicas de RLS e concede acesso total ao banco de dados. Use-a apenas em codigo do lado do servidor, edge functions ou ambientes de backend seguros.
Nunca exponha a chave service role em codigo do lado do cliente. Esta chave tem acesso irrestrito a todo o seu banco de dados, incluindo todos os dados de usuarios. Armazene-a em variaveis de ambiente e use-a apenas em contextos do lado do servidor.
Tokens JWT
Quando um usuario faz login, o Supabase emite um JSON Web Token (JWT) que contem o ID do usuario, email e metadados. Este token e usado para autenticar requisicoes subsequentes da API.
Estrutura do token
Um JWT decodificado do GoConverso contem:
{
"sub": "550e8400-e29b-41d4-a716-446655440000",
"email": "user@example.com",
"role": "authenticated",
"aud": "authenticated",
"exp": 1706540400,
"iat": 1706536800,
"user_metadata": {
"full_name": "Maria Silva",
"username": "mariasilva",
"niche": "barber"
}
}Ciclo de vida do token
| Evento | Comportamento |
|---|---|
| Login | Token de acesso + token de atualizacao emitidos |
| Token de acesso expira | Atualizado automaticamente usando o token de atualizacao (padrao: 1 hora) |
| Token de atualizacao expira | Usuario precisa fazer login novamente (padrao: 7 dias) |
| Logout | Ambos os tokens sao invalidados |
Autenticando requisicoes
Toda requisicao da API deve incluir dois cabecalhos:
curl -X GET "https://<project-id>.supabase.co/rest/v1/bookings" \
-H "apikey: <your-anon-key>" \
-H "Authorization: Bearer <jwt-access-token>" \
-H "Content-Type: application/json"apikey— identifica seu projeto (use a chave anon)Authorization— identifica o usuario autenticado (use o token de acesso JWT)
Cadastro com email e senha
Criar a conta do usuario
const { data, error } = await supabase.auth.signUp({
email: 'newuser@example.com',
password: 'secure-password-123',
options: {
data: {
full_name: 'New User',
username: 'newuser',
niche: 'personal_trainer'
}
}
})Tratar a resposta
Em caso de sucesso, a resposta inclui o novo objeto de usuario e uma sessao:
{
"user": {
"id": "550e8400-e29b-41d4-a716-446655440000",
"email": "newuser@example.com",
"user_metadata": {
"full_name": "New User",
"username": "newuser",
"niche": "personal_trainer"
}
},
"session": {
"access_token": "eyJhbGciOiJIUzI1NiIs...",
"refresh_token": "v1.MjA5Nj...",
"expires_in": 3600
}
}Criacao automatica do perfil
O GoConverso cria automaticamente uma linha na tabela profiles quando um novo usuario se cadastra. Isso e feito por um trigger do banco de dados, entao nenhuma chamada adicional a API e necessaria.
Login com email e senha
const { data, error } = await supabase.auth.signInWithPassword({
email: 'user@example.com',
password: 'secure-password-123'
})
if (error) {
console.error('Sign in failed:', error.message)
return
}
// Access token for API requests
const accessToken = data.session.access_tokenOAuth com Google
O GoConverso suporta Google OAuth para login com um clique. Este e o metodo recomendado para a experiencia de onboarding mais rapida.
Iniciar o fluxo OAuth
const { data, error } = await supabase.auth.signInWithOAuth({
provider: 'google',
options: {
redirectTo: 'https://converso.pro/auth/callback',
queryParams: {
access_type: 'offline',
prompt: 'consent'
}
}
})Tratar o callback
Apos o usuario autorizar seu aplicativo, ele e redirecionado para a URL de callback com um codigo de autorizacao. O cliente Supabase automaticamente troca isso por uma sessao.
// In your callback page (e.g., /auth/callback)
const { data: { session }, error } = await supabase.auth.getSession()
if (session) {
// User is authenticated
console.log('Signed in as:', session.user.email)
}Acessar o Google Calendar (opcional)
Se voce precisa de integracao com o Google Calendar, solicite escopos adicionais durante o fluxo OAuth:
const { data, error } = await supabase.auth.signInWithOAuth({
provider: 'google',
options: {
redirectTo: 'https://converso.pro/auth/callback',
scopes: 'https://www.googleapis.com/auth/calendar.events'
}
})Autenticacao OTP (Portal do Cliente)
O GoConverso usa autenticacao baseada em OTP para o portal do cliente. Os clientes recebem um codigo de 6 digitos por email para acessar o portal sem precisar de senha.
// Request OTP
const response = await fetch(
'https://<project-id>.supabase.co/functions/v1/send-portal-otp',
{
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
email: 'client@example.com',
professionalId: '<professional-uuid>'
})
}
)
// Verify OTP
const verify = await fetch(
'https://<project-id>.supabase.co/functions/v1/verify-portal-otp',
{
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
email: 'client@example.com',
code: '123456',
professionalId: '<professional-uuid>'
})
}
)Os codigos OTP expiram apos 10 minutos e so podem ser usados uma vez. Se um cliente solicitar um novo codigo, quaisquer codigos emitidos anteriormente sao automaticamente invalidados.
Gerenciamento de sessoes
A biblioteca cliente do Supabase gerencia as sessoes automaticamente, incluindo a atualizacao de tokens. Voce pode escutar mudancas no estado de autenticacao:
supabase.auth.onAuthStateChange((event, session) => {
switch (event) {
case 'SIGNED_IN':
console.log('User signed in:', session.user.email)
break
case 'SIGNED_OUT':
console.log('User signed out')
break
case 'TOKEN_REFRESHED':
console.log('Token refreshed')
break
}
})Logout
const { error } = await supabase.auth.signOut()Melhores praticas de seguranca
- Armazene tokens de forma segura — Use cookies
httpOnlyou armazenamento seguro. Nunca armazene JWTs nolocalStoragepara aplicacoes sensiveis. - Use a chave anon no cliente — A chave anon e limitada pelas politicas de RLS. Nunca use a chave service role em codigo do navegador.
- Valide tokens no servidor — Se voce construir endpoints personalizados, verifique a assinatura do JWT usando o segredo JWT do seu projeto.
- Ative RLS em todas as tabelas — O GoConverso tem RLS ativado por padrao. Nunca desative sem entender as implicacoes.
- Rotacione chaves periodicamente — Se voce suspeitar que uma chave foi comprometida, rotacione-a imediatamente no painel do Supabase.
Em seguida, aprenda como trabalhar com Webhooks para receber notificacoes de eventos em tempo real.