Claims do token

O Auth Platform emite access_tokens JWT assinados com RS256. Além dos claims padrão OIDC, cada token carrega claims específicos do sistema.

Estrutura completa

{
  "iss": "https://auth.seudominio.com",
  "aud": "https://auth.seudominio.com",
  "sub": "3857ed26-1234-5678-abcd-ef0123456789",
  "exp": 1710000600,
  "iat": 1710000000,
  "jti": "unique-token-id",

  "email": "alice@exemplo.com",

  "account_id": "acc-uuid-da-conta-ativa",

  "roles": ["admin"],

  "is_admin": true,

  "resource_scopes": ["carteira:*", "carteira:admin"],

  "amr": ["pwd"]
}

Descrição de cada campo

Campos OIDC padrão

CampoTipoDescrição
issstringIssuer — URL pública do Auth Platform
audstringAudience — mesmo valor que iss por padrão
substringSubject — UUID global do usuário (nunca muda)
expnumberExpiração (Unix timestamp) — 10 minutos por padrão
iatnumberEmitido em (Unix timestamp)
jtistringJWT ID — único por token, usado para revogação
emailstringE-mail verificado do usuário

Claims customizados do Auth Platform

CampoTipoDescrição
account_idstringUUID da conta ativa neste sistema. Usado para isolamento multi-tenant
rolesstring[]Nomes das roles atribuídas ao usuário nesta conta
is_adminbooleantrue se o usuário tem pelo menos uma role com isAdmin=true
resource_scopesstring[]Union de todos os escopos das roles + profiles desta membership
amrstring[]Authentication Method Reference: ["pwd"] para senha, ["mfa"] para MFA

account_id vs sub

  • sub = identidade global do usuário (mesma em todos os sistemas)
  • account_id = conta dentro deste sistema específico

Em sistemas multi-conta (multiAccount=true), o mesmo usuário pode ter contas diferentes e o account_id muda a cada login dependendo da conta escolhida. Use account_id para isolar dados no seu banco:

// ✅ Correto — dados isolados por conta
const orders = await db.order.findMany({ where: { accountId: req.user.account_id } });

// ❌ Errado — mistura dados de todas as contas do usuário
const orders = await db.order.findMany({ where: { userId: req.user.sub } });

Verificando permissões

// Verificar se tem um escopo específico
function hasScope(user: TokenPayload, scope: string): boolean {
  return user.resource_scopes?.includes(scope) ?? false;
}

// Verificar se é admin
function isAdmin(user: TokenPayload): boolean {
  return user.is_admin === true;
}

// Verificar role
function hasRole(user: TokenPayload, role: string): boolean {
  return user.roles?.includes(role) ?? false;
}

TTL dos tokens

TokenDuração
access_token10 minutos
id_token10 minutos
refresh_token14 dias (renovado a cada uso)

O oidc-client-ts renova o access_token automaticamente via automaticSilentRenew.