-
Notifications
You must be signed in to change notification settings - Fork 1
Autenticação com Google
Este documento detalha o processo de login e registro de usuários na plataforma utilizando suas contas do Google, através do protocolo OAuth2.
O processo de autenticação é dividido em duas etapas principais, gerenciadas por duas views distintas no backend:
- Início da Autenticação: O usuário clica em "Login com Google" no frontend. O frontend redireciona para o endpoint de início da autenticação no backend.
- Redirecionamento para o Google: O backend gera uma URL de autorização segura e redireciona o navegador do usuário para a página de login do Google.
- Autorização do Usuário: O usuário concede permissão para a aplicação acessar suas informações básicas de perfil (email, nome).
- Callback do Google: Após a autorização, o Google redireciona o usuário de volta para um endpoint de callback no backend, enviando um código de autorização temporário.
- Troca do Código por Token: O backend troca esse código de autorização por um access token e um ID token, fazendo uma comunicação segura com os servidores do Google.
- Obtenção de Dados do Usuário: Com o access token, o backend solicita as informações do perfil do usuário ao Google.
-
Criação/Atualização da Conta: O backend verifica se já existe um usuário com o email fornecido.
- Se não existir, uma nova conta é criada.
- Se existir, seus dados são verificados e, se necessário, atualizados (como o ID do Google).
- Autenticação e Redirecionamento Final: O backend gera um token JWT para o usuário e o redireciona de volta para o frontend, incluindo o token na URL. O frontend utiliza este token para autenticar o usuário na aplicação.
A lógica está implementada no arquivo backend/apps/account/views.py
.
-
Endpoint:
/account/google/auth/
- Propósito: Iniciar o fluxo de autenticação OAuth2.
Esta view é o ponto de entrada do fluxo.
-
Geração de
state
: Cria um token aleatório e seguro (state
) para previnir ataques de Cross-Site Request Forgery (CSRF). Este token é armazenado na sessão do usuário. -
Construção da URL: Monta a URL de autorização do Google, incluindo:
-
client_id
: A identificação da sua aplicação no Google. -
redirect_uri
: A URL de callback para onde o Google deve retornar após a autorização. -
scope
: As permissões solicitadas (neste caso,openid
,email
,profile
). -
response_type=code
: Indica que esperamos receber um código de autorização. -
state
: O token CSRF gerado.
-
- Redirecionamento: Redireciona o navegador do usuário para a URL de autorização do Google.
-
Endpoint:
/account/google/callback/
- Propósito: Processar o retorno do Google após a autorização do usuário.
Esta view lida com a resposta do Google.
-
Validação do
state
: Compara ostate
recebido do Google com o que foi armazenado na sessão para garantir que a requisição é legítima. -
Troca do Código por Token: Chama o método
_exchange_code_for_token
para enviar ocode
recebido do Google e obter umaccess_token
. -
Obtenção de Informações do Usuário: Com o
access_token
, chama o método_get_user_info
para buscar os dados do perfil do usuário (email, nome, id do Google). -
Criação ou Atualização da Conta: Chama
_create_or_update_account
para criar ou buscar o usuário no banco de dados local. - Geração do JWT: Se a conta for criada/obtida com sucesso, um token JWT é gerado para autenticar o usuário nas requisições futuras à API.
-
Redirecionamento para o Frontend: Redireciona o usuário para uma URL do frontend (ex:
/user/login
), passando o token JWT e o ID do usuário como parâmetros na URL. O frontend pode então extrair esses dados para finalizar o login.
-
_exchange_code_for_token(auth_code)
- Faz uma requisição
POST
segura para o endpoint de token do Google. - Envia o
client_id
,client_secret
, ocode
de autorização e aredirect_uri
. - Recebe como resposta um JSON contendo o
access_token
,id_token
, e outras informações. - Retorna os dados do token.
- Faz uma requisição
-
_get_user_info(access_token)
- Faz uma requisição
GET
para o endpoint de userinfo do Google. - Envia o
access_token
no cabeçalho de autorização (Authorization: Bearer <token>
). - Recebe como resposta um JSON com as informações do perfil do usuário.
- Retorna os dados do usuário.
- Faz uma requisição
-
_create_or_update_account(user_info, id_token)
- Usa o
email
do usuário como chave principal para a busca no banco de dados. -
get_or_create
: Tenta encontrar um usuário com o email fornecido.-
Se encontrado (usuário existente): Garante que o campo
google_sub
(ID do Google) está preenchido e que a conta está ativa (is_active = True
). -
Se não encontrado (novo usuário): Cria uma nova conta com os dados recebidos do Google (nome, sobrenome, email,
google_sub
). A conta já é criada como ativa.
-
Se encontrado (usuário existente): Garante que o campo
-
Unicidade do
username
: Gera um nome de usuário a partir do email. Se o nome de usuário já existir, adiciona um sufixo numérico para garantir a unicidade. - Retorna a instância do objeto
Account
(usuário).
- Usa o
O fluxo inclui tratamento de erros em várias etapas:
- Se o usuário negar a autorização no Google.
- Se o
state
for inválido (possível CSRF). - Se a troca do código por token falhar.
- Se a obtenção das informações do usuário falhar.
- Se houver um erro ao criar a conta no banco de dados.
Em todos os casos de erro, o usuário é redirecionado para a página de login do frontend com um parâmetro de erro na URL (ex: ?error=auth_failed
), permitindo que o frontend exiba uma mensagem apropriada.