Skip to main content
O login é feito via POST com as credenciais no corpo da requisição (JSON). Nunca são enviadas via URL (GET query params).

Fluxo de Autenticação (2 etapas)

O AssessIQ usa um fluxo de duas etapas antes de criar a sessão:
1

Verificar credenciais + 2FA

POST /api/auth/check-credentials — valida email/senha e informa se 2FA é necessário.
2

Criar sessão NextAuth

signIn('credentials', { email, password }) via NextAuth.js — cria o cookie JWT de sessão.

POST /api/auth/check-credentials

Valida as credenciais e retorna se o usuário precisa passar por 2FA.

Request

POST /api/auth/check-credentials
Content-Type: application/json

{
  "email": "usuario@exemplo.com",
  "password": "minhasenha"
}

Resposta — sem 2FA

{
  "success": true,
  "requires2fa": false
}

Resposta — com 2FA habilitado

{
  "success": true,
  "requires2fa": true,
  "methods": ["email", "totp"]
}

Erros

StatusDescrição
400Email ou senha ausentes
401Credenciais inválidas
429Muitas tentativas (rate limit: 5/10 min por IP)
Após 5 tentativas falhas em 10 minutos, o IP fica bloqueado por 10 minutos.

POST /api/auth/callback/credentials

Endpoint interno do NextAuth que cria a sessão. É chamado automaticamente pelo signIn() do next-auth/reactnão chame diretamente.
POST /api/auth/callback/credentials
Content-Type: application/x-www-form-urlencoded

email=usuario@exemplo.com&password=suasenha&csrfToken=TOKEN&callbackUrl=/pt/home
O cookie next-auth.session-token (HttpOnly, Secure) é retornado na resposta.

Obtendo o CSRF Token

Necessário para chamar o endpoint de callback diretamente (clientes não-browser).
GET /api/auth/csrf
{
  "csrfToken": "abc123..."
}

Verificar Sessão Atual

GET /api/auth/session
{
  "user": {
    "id": "user_id",
    "email": "usuario@exemplo.com",
    "name": "Nome do Usuário",
    "role": "PROFESSOR"
  },
  "expires": "2026-03-24T20:00:00.000Z"
}

Logout

POST /api/auth/logout

OAuth (Google)

GET /api/auth/signin/google
Redireciona para o fluxo OAuth do Google. Após autenticação, retorna para /{locale}/home.

Notas de Segurança

  • Senhas armazenadas com bcrypt (cost factor 10)
  • Senha mínima: 8 caracteres
  • Sessões expiram e são invalidadas via sessionVersion no banco
  • 2FA disponível por e-mail ou TOTP
  • DEFAULT_DEV_PASSWORD bloqueado em produção — usuários sem senha devem usar o fluxo “esqueci minha senha”