Gerar e Retornar Token JWT (JSON Web Token)
JSON Web Token é um padrão da Internet proposto para criação de dados com assinatura e/ou criptografia opcionais.
É um método RFC 7519 padrão do setor aberto para representar declarações de forma segura entre duas partes.
Os tokens são assinados usando um segredo privado ou uma chave pública/privada.
O objetivo é transmitir ou armazenar de forma compacta e segura objetos JSON entre diferentes aplicações.
O que é JWT
JWT é um Token composto de três partes.ENCODED
header, payload e signature, respectivamente.
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
DECODED
Header: ALGORITHM & TOKEN TYPEExistem vários tipos de algoritmos que podem ser usados para criar o token.
A chave pública/privada pode inclusive ser um certificado digital.
{
"alg": "HS256",
"typ": "JWT"
}
Payload: DATA (objeto, conteúdo).
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
}
Verify Signature: Hash gerado a partir de private key.
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
your-256-bit-secret
)
A utilização de tokens permite:
- Garantir a integridade, validade, segurança da informação.
- Configurar uma expiração.
Toda vez que chegar uma requisição na API o token será verificado no header.
Informações Úteis do Token
São alguns padrões de informações úteis dentro do JWT.- iss - Issuer: Emissor do token, domínio da app geradora
- sub - Subject: Assunto do token, muito usado para guardar o ID do usuário
- aud - Audience: Público do token, quem pode usar
- exp - Expiration: Expiração do token, quando expira
- nbf - Not Before: Não antes, quando o token começa a ser válido (não pode ser aceito antes)
- iat - Issued At: Emissão do token, quando foi gerado
- jti - JWT ID: Identificador do token, usado para garantir que é único
Existem ferramentas para gerenciamento de token, mas na aula vamos fazer manualmente.
jwt.io
É um site que traz informações sobre o JWT, como: Quais bilbiotecas estão disponíveis para gerar o token em determinada linguagem. JWT.IO permite decodificar, verificar e gerar JWT.Library jsonwebtoken
É uma biblioteca para criar, descriptografar Token.
npm install --save jsonwebtoken
Instalar os @types do TypeScript para a biblioteca jsonwebtoken
npm install --save-dev @types/jsonwebtoken
Importar a biblioteca na rota criada para autorização em src/routes/authorization.route.tsPode ser qualquer nome, vamos usar JWT
import JWT from 'jsonwebtoken';
Criar e Retornar um Token JWT
Refatorar a rota de autorização em src/routes/authorization.route.ts para gerar e retornar um token JWT na requisição.Após a chamado do método userRepository.byUserNameAndPassword(), adicionar o trecho de código abaixo:
// Gerar um token JWT
const jwtPayLoad = {userName: user.userName};
const jwtSecretKey = process.env.JWT_SECRET_KEY;
const jwtOptions = {subject: user?.uuid};
const jwtToken = JWT.sign(jwtPayLoad, jwtSecretKey, jwtOptions);
// Response Token
res.status(StatusCodes.OK).json({ token: jwtToken });
RETORNO
endpoint: http://localhost:3000/tokenuserName: admin
userPassword: admin
{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJpYXQiOjE2NDE5MjUwNjMsInN1YiI6IjE1ZDA1ZDg0LTZhMGEtNDljZS05ZjBkLWY3YTI0ZDE0NDE3ZCJ9.
4hXzjwiPfg83QNof0FTeuOuYT78cfny-PARH94uQt8E"
}