Tokens criptografados
Tudo o que o client precisa fazer para receber tokens criptografados: escolher a chave, gerar o par, configurar o Authio e o app, testar e trocar a chave.
Por padrão os tokens do Authio são JWTs assinados: qualquer um que tenha o token lê o conteúdo. Com a criptografia ligada, eles viram JWE, que só quem tem a chave abre. Este guia cobre o caminho inteiro, do console até o app em produção. Para o UserInfo em JWT, veja UserInfo assinado e criptografado.
Qual chave usar
| Chave da plataforma | Chave do próprio client | |
|---|---|---|
| Access e refresh token | Criptografados; só o Authio lê | Criptografados com a chave do client |
| ID token | Só assinado, para o app ler | Criptografado com a chave do client e assinado por dentro |
| O que o app configura | Nada | A chave privada, numa variável de ambiente |
| Claims do access token no app | Ilegíveis | Legíveis depois de descriptografar com a mesma chave |
| Resource servers | Validam por introspecção | Validam por introspecção |
Use a chave da plataforma para esconder o conteúdo do access e do refresh token de tudo fora do Authio (navegador, logs, proxies) sem mexer no app. Use a chave do próprio client quando o ID token também não pode trafegar legível, nem mesmo dentro da sua infraestrutura. Em qualquer caso, a criptografia esconde o conteúdo; ela não impede o uso: um access token continua valendo para quem o tiver em mãos.
Só para clients com back-end
Checklist
- Gerar (ou importar) o par de chaves do client e baixar a chave privada.
- Guardar a chave privada num segredo do app, nunca no repositório.
- Configurar o app com a chave e fazer o deploy.
- Só então ligar a criptografia no client, com a chave do próprio client,
RSA-OAEPe um algoritmo CBC-HMAC. - Configurar as APIs que recebem o access token para validá-lo por introspecção.
- Testar um login e uma renovação de sessão.
A ordem importa
Passo a passo no Authio
Gere o par de chaves e baixe a chave privada
Em Clients, abra o client e vá em Editar → Segurança → Criptografia de token → Gerar par de chaves. A chave privada aparece uma única vez, em JWK e em PEM: use Baixar JWK (ou copie) antes de fechar o diálogo. O Authio não mostra a chave privada de novo; perdê-la significa gerar outro par.
Se você já tem uma chave RSA de 2048 a 4096 bits, use Importar chave privada (JWK ou PEM); o
kidde uma JWK importada é mantido.Guarde a chave no app
Coloque a JWK (o conteúdo do arquivo baixado) num segredo do app: uma variável de ambiente, um key vault. Veja abaixo onde cada biblioteca procura a chave, e faça o deploy do app já com ela.
Ligue a criptografia no client
Ainda em Segurança → Criptografia de token, preencha e salve:
Campo Valor Criptografia de token Ligada Chave de criptografia Chave do próprio client Algoritmo JWE RSA Algoritmo de criptografia da chave RSA-OAEPAlgoritmo de criptografia do conteúdo A256CBC-HS512(ou outro CBC-HMAC; o Authio não criptografa com AES-GCM)Tokens criptografados com a chave do client são sempre assinados por dentro, por isso Assinar tokens criptografados fica ligado sozinho. Prefira
RSA-OAEPaRSA1_5: algumas bibliotecas, como o Auth.js v5, não abrem RSA1_5.Teste
Faça um login: o
id_tokenda resposta do endpoint de token tem cinco partes separadas por ponto (um JWE) e o app abre a sessão normalmente. Depois espere o access token vencer (ou force uma renovação) e confira que a sessão continua.
Configure o seu app
Depois de descriptografado, o ID token é um JWT assinado comum, validado pelo JWKS do realm como sempre. A única coisa nova é a chave privada.
Next.js (Auth.js v5 e NextAuth v4)
A partir da versão 2.2.0, o authio-provider-nextauth descriptografa o ID token sozinho. Coloque a chave privada em AUTH_AUTHIO_ENCRYPTION_KEY: a JWK que o Authio mostrou ao gerar o par, ou o PEM (PKCS#8 ou PKCS#1) quando você importou a chave. Nada muda no código.
AUTH_AUTHIO_ENCRYPTION_KEY='{"kty":"RSA","n":"...","e":"AQAB","d":"...","p":"...","q":"...","dp":"...","dq":"...","qi":"..."}'No Auth.js v5 os algoritmos saem do próprio token. No NextAuth v4 o openid-client só aceita os algoritmos que conhece: o provider assume os padrões do Authio (RSA-OAEP e A256CBC-HS512); se o client usa outros, informe encryption: { alg, enc } no Authio(). No v4, com a chave configurada, o ID token precisa chegar criptografado: tire a variável se desligar a criptografia.
O access token chega como o Authio emitiu, porque é ele que a sua API recebe. Para ler as claims dele no servidor, ou abrir os tokens de uma renovação que o seu app faz por conta própria, use decryptAuthioToken:
import { decryptAuthioToken } from 'authio-provider-nextauth/v5'
import { decodeJwt } from 'jose'
// Usa AUTH_AUTHIO_ENCRYPTION_KEY; um token que não veio criptografado volta como está
const claims = decodeJwt(await decryptAuthioToken(token.accessToken)).NET (BFF e OpenID Connect)
No BFF do Authio (Authio.AspNetCore.Bff 0.6.0 ou superior), informe a chave em Authio:Bff:EncryptionKey (a JWK ou o PEM). Ele descriptografa o ID token e o access token de onde saem os papéis e a organização da sessão, no login e a cada renovação, e confere a chave na inicialização.
{
"Authio": {
"Bff": {
"EncryptionKey": "<a JWK privada ou o PEM, vindo de um segredo>"
}
}
}Com o handler de OpenID Connect do ASP.NET Core diretamente, passe a chave em TokenValidationParameters.TokenDecryptionKey.
Qualquer cliente OIDC
- Receba o
id_tokendo endpoint de token: com cinco partes, ele é um JWE. - Descriptografe com a chave privada do client, aceitando o
alge oencconfigurados no client (veja o cabeçalho do JWE). - O conteúdo é um JWT assinado: valide assinatura,
iss,aud,expenoncepelo JWKS do realm. - Mande o access token para a sua API como veio. Se o app precisar das claims dele, descriptografe uma cópia com a mesma chave.
APIs e resource servers
Uma API não tem a chave do client que pediu o token, então não abre o access token: ela o valida por introspecção. Com o Authio.AspNetCore, configure Authio:Introspection como IntrospectionOnly; sem isso, a API tenta ler o token localmente e recusa o JWE.
{
"Authio": {
"Introspection": "IntrospectionOnly"
}
}Trocar ou remover a chave
Gerar outro par, importar outra chave ou remover a chave torna ilegível, na hora, todo token criptografado com a chave anterior: as sessões abertas precisam de novo login. Para trocar com o mínimo de impacto:
- Gere o par novo e baixe a chave privada.
- Atualize o segredo do app e faça o deploy logo em seguida.
- Avise que quem estava logado vai entrar de novo.
Remover a chave volta o client para a chave da plataforma e desliga o UserInfo criptografado.
Problemas comuns
| Sintoma | Causa e solução |
|---|---|
JWE decryption is not configured (Auth.js v5) | O authio-provider-nextauth é anterior à 2.2.0, ou AUTH_AUTHIO_ENCRYPTION_KEY não está definida. Atualize o pacote e defina a variável. |
unexpected JWE alg received (NextAuth v4) | Os algoritmos do client no Authio não batem com os do provider. Informe encryption: { alg, enc } com os valores do client. |
| Login falha logo depois de gerar uma chave nova | O app ainda tem a chave antiga. Atualize o segredo com a chave nova. |
| Perdi a chave privada | O Authio não mostra a chave de novo. Gere outro par e atualize o app; se o app afetado for o seu acesso ao console, desligue a criptografia do client antes, por outro meio, e religue depois. |
| O app não lê as claims do access token | Com a chave da plataforma, ele é ilegível para o app por desenho. Com a chave do client, descriptografe-o antes de ler. |