Com esse histórico e alguns padrões como base, como podemos processar o JWT de cima para baixo e quais informações ele contém?
O JWT acima consiste em três partes, cada uma separada por um ponto ('.'):
- Cabeçalho:: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
- Carga útil: eyJzdWIiOiIxMjM0NTY3ODkwQUJDIiwibmFtZSI6IkhlbnJpayBMb2VzZXIiLCJpYXQiOjE2MTExNDA0MDAsImV4cCI6MTYxMTIzNDU2N30
- Assinatura: _iVbBcypdse-9sjrxp9iOrGsXKBWrBB3mrHgBtukcfM
Tanto o cabeçalho quanto a carga útil são codificados em base64url e, sem levar em conta possíveis preenchimentos, podem ser decodificados assim:
henrik@home> base64 -d <<< eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
{"alg":"HS256","typ":"JWT"}
henrik@home> base64 -d <<< eyJzdWIiOiIxMjM0NTY3ODkwQUJDIiwibmFtZSI6IkhlbnJpayBMb2VzZXIiLCJpYXQiOjE2MTExNDA0MDAsImV4cCI6MTYxMTIzNDU2N30
{"sub":"1234567890ABC","name":"Henrik Loeser","iat":1611140400,"exp":1611234567}base64: invalid input
O cabeçalho contém informações sobre o alg(orithm) utilizado — aqui, HS256 (HMAC SHA256). A carga útil depende do tipo de token (access/refresh/ID/…) e é composta por declarações. Esses e outros campos de cabeçalho e carga útil do JOSE predefinidos são gerenciados pela IANA. No exemplo acima, os campos e declarações são subj(ect), name, issued at (iat) e exp(iration time).
A assinatura é calculada aplicando o algoritmo indicado à concatenação do cabeçalho '.' e carga útil e, em seguida, codificar o base64url o resultado. Depois disso, as três partes separadas por um ponto compõem o JWT. Os detalhes de como as assinaturas são derivadas são definidos no RFC 7515.
Você pode acessar o JWT acima neste depurador online em JTW.io. Primeiro, ele mostrará a mensagem "Assinatura inválida". Você pode resolvê-lo substituindo o segredo padrão mostrado por !!!my-really-big-256-bit-secret!!!.