Feature: Autenticação Dupla (API Key + JWT)
Introdução ao documento
Documenta o mecanismo de autenticação dupla da API: API Key para sistemas externos e JWT para participantes.
Versionamento
- Versão do documento: 1.0.0
- Última atualização: 2026-03-04
- Responsável: Time Dhedalos
Referencial teórico
Visão geral
A API utiliza dois mecanismos de autenticação simultâneos:
- API Key — valida o sistema consumidor (app mobile) via header
Authorization - JWT — valida a identidade do participante para operações sensíveis (submissão de atividade)
Atores
- App Mobile — porta a API Key como credencial de sistema
- Participante — recebe JWT para submissão autenticada
- Administrador — gera API Keys via Artisan ou painel
Pré-condições
- API Key gerada e registrada na tabela
api_keys— Evidência:app/Console/Commands/GenerateApiKey.php:26 JWT_SECRETconfigurado no ambiente — Evidência:app/Http/Middleware/JwtAuthenticate.php:24
Fluxo principal
Fluxo API Key
- Cliente envia request com header
Authorization: <api-key> ApiKeyMiddleware::handle()extrai API Key do header- Evidência:
app/Http/Middleware/ApiKeyMiddleware.php:17
- Evidência:
- Consulta tabela
api_keyspor match exato- Evidência:
app/Http/Middleware/ApiKeyMiddleware.php:28
- Evidência:
- Se encontrada, request prossegue; se não, retorna HTTP 401
Fluxo JWT
- App mobile obtém JWT via
GET /api/submissions/token(protegido por API Key)- Evidência:
routes/api.php:15,app/Http/Controllers/Api/SubmissionController.php:755
- Evidência:
- JWT é gerado com HS256 e
JWT_SECRET, validade de 1 hora- Evidência:
app/Http/Controllers/Api/SubmissionController.php:755
- Evidência:
- App mobile envia
POST /api/submissionscom headerAuthorization: Bearer <jwt>- Evidência:
routes/api.php:34
- Evidência:
JwtAuthenticate::handle()decodifica JWT com HS256 +JWT_SECRET- Evidência:
app/Http/Middleware/JwtAuthenticate.php:24
- Evidência:
- Se válido, request prossegue; se inválido/expirado, retorna HTTP 401
Fluxos alternativos
- API Key ausente: Middleware retorna HTTP 401 com mensagem de erro.
- JWT expirado: Middleware retorna HTTP 401. Cliente deve obter novo token.
- JWT malformado: Middleware retorna HTTP 401.
Regras de negócio
- API Key é obrigatória para todas as rotas API (exceto healthcheck).
- Evidência:
routes/api.php:14(group middlewareapi.key)
- Evidência:
- JWT é obrigatório apenas para
POST /api/submissions(criação pelo participante).- Evidência:
routes/api.php:33(group middlewarejwt.auth)
- Evidência:
- Validade do JWT: 1 hora (3600 segundos).
- Evidência:
app/Http/Controllers/Api/SubmissionController.php:755
- Evidência:
- Algoritmo: HS256 (HMAC SHA-256).
- Evidência:
app/Http/Middleware/JwtAuthenticate.php:24
- Evidência:
- API Key: String de 64 caracteres aleatórios, gerada via
Str::random(64).- Evidência:
app/Console/Commands/GenerateApiKey.php:26
- Evidência:
Estados possíveis
- Não aplicável (auth é stateless)
Endpoints envolvidos
GET /api/submissions/token— obter JWT (openapi.yaml)- Todas as rotas em
routes/api.php:14-34— protegidas por API Key POST /api/submissions— protegida por JWT (openapi.yaml)
Dados impactados
api_keys— registro de chaves de API (model.md)
Pendências
- ⚠️ PENDÊNCIA:
JWT_SECRETnão consta no.env.example. Deve ser adicionado. - ⚠️ PENDÊNCIA: Avaliar implementação de refresh token ou extensão automática de validade do JWT.
- ⚠️ PENDÊNCIA: Documentar procedimento de rotação de API Keys em produção.