Skip to content

Autenticação com Google

Lessa edited this page Oct 14, 2025 · 1 revision

Documentação: Autenticação com Google (OAuth2)

Este documento detalha o processo de login e registro de usuários na plataforma utilizando suas contas do Google, através do protocolo OAuth2.

Visão Geral do Fluxo

O processo de autenticação é dividido em duas etapas principais, gerenciadas por duas views distintas no backend:

  1. 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.
  2. 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.
  3. 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).
  4. 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.
  5. 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.
  6. Obtenção de Dados do Usuário: Com o access token, o backend solicita as informações do perfil do usuário ao Google.
  7. 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).
  8. 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.

Componentes do Backend

A lógica está implementada no arquivo backend/apps/account/views.py.

1. GoogleAuthView

  • Endpoint: /account/google/auth/
  • Propósito: Iniciar o fluxo de autenticação OAuth2.

Método GET

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.

2. GoogleCallbackView

  • Endpoint: /account/google/callback/
  • Propósito: Processar o retorno do Google após a autorização do usuário.

Método GET

Esta view lida com a resposta do Google.

  1. Validação do state: Compara o state recebido do Google com o que foi armazenado na sessão para garantir que a requisição é legítima.
  2. Troca do Código por Token: Chama o método _exchange_code_for_token para enviar o code recebido do Google e obter um access_token.
  3. 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).
  4. Criação ou Atualização da Conta: Chama _create_or_update_account para criar ou buscar o usuário no banco de dados local.
  5. 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.
  6. 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.

Métodos Auxiliares

  • _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, o code de autorização e a redirect_uri.
    • Recebe como resposta um JSON contendo o access_token, id_token, e outras informações.
    • Retorna os dados do token.
  • _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.
  • _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.
    • 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).

Tratamento de Erros

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.

Clone this wiki locally