Autenticação
Os dois modos de autenticação Keycloak — usuário final (/api) e app-to-app (/service).
A API valida JWTs emitidos pelo Keycloak usando JWKS (chaves públicas
buscadas remotamente e cacheadas pela lib jose). Há dois middlewares distintos,
montados por prefixo de rota no AppModule:
| Prefixo | Middleware | Popula | Emissor validado |
|---|---|---|---|
/api/* | KeycloakAuthMiddleware | req.user | KEYCLOAK_REALM_URL |
/service/* | ServiceAuthMiddleware | req.service | KEYCLOAK_AUTH_URL |
Ambos exigem o header Authorization: Bearer <token>. Sem ele, ou com token
inválido/expirado, a resposta é 401 Unauthorized.
Fluxo de usuário final (/api/*)
Destinado a usuários humanos autenticados no realm do Keycloak. O middleware:
- Extrai e verifica o JWT contra o JWKS do realm (
KEYCLOAK_REALM_URL). - Lê o
sub(Keycloak subject) do token. - Consulta o cache Redis (
user_auth:<sub>, TTL de 5 min). Em hit, usa o usuário cacheado. - Em miss, resolve o usuário local via
idIdentity = sube carrega suas permissões (UMA) e a flagisSuperAdmin(role de realmsuper_admin).
req.user (tipo IUser) carrega, entre outros, o id do usuário local, suas
permissions e isSuperAdmin — consumidos pelo PermissionGuard.
Fluxo app-to-app (/service/*)
Destinado a comunicação entre serviços usando client credentials do Keycloak. O middleware:
- Verifica o JWT contra o JWKS de
KEYCLOAK_AUTH_URL. - Lê o
azp(authorized party =client_idque chamou, ex.:app1-tenant-xyz). - Resolve o tenant correspondente àquele client (via
keycloakClientId), populandoreq.servicecom o contexto de serviço (tenantId, escopos).
Rotas /service/* não usam o PermissionGuard baseado em resource/scope
do usuário; a autorização se dá pela identidade do client (tenant) e seus
allowedScopes.
Cache de autenticação
O contexto de usuário é cacheado no Redis por 5 minutos
(USER_CACHE_TTL_SECONDS). Alterações de permissão no Keycloak podem levar até
esse intervalo para refletir na API.