Node

Microserviço para Autenticação e Gerenciamento de Usuários - REST API

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 TYPE
Existem 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: Backend não precisa armazenar o token, pois ele será de responsabilidade do frontend.
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.
Fora isso, podemos adicionar qualquer informação dentro do payload.
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.ts
Pode 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/token
userName: admin
userPassword: admin

                                {
                                    "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
                                    eyJpYXQiOjE2NDE5MjUwNjMsInN1YiI6IjE1ZDA1ZDg0LTZhMGEtNDljZS05ZjBkLWY3YTI0ZDE0NDE3ZCJ9.
                                    4hXzjwiPfg83QNof0FTeuOuYT78cfny-PARH94uQt8E"
                                }