Chaves Públicas e Privadas
O agente ngrok para colocar seu aplicativo na internet e protegê-lo para que somente você possa acessá-lo. Ele pressupõe que você já tenha seu próprio aplicativo em execução localmente.
O que são tokens
Tokens são componentes léxicos que possuem informações que podem ser interpretadas por algum tradutor, exemplo de tokens são as linguagens de programação que tem seu código traduzido por um compilador para a linguagem de máquina.
O que é jwt
Jwt significa json Web Token, é um formato padronizado para armazenar informações de forma encriptadas durante requisições. Esse padrão é usado para criar segurança em requisições como em editar, criar, atualizar e deletar informações privadas.
Esse padrão é encriptado por uma palavra chave escolhida pelo desenvolvedor, não podendo ser vazada de maneira alguma, sendo descriptografada no backend e verificando a integridade do token, se não estiver assinado com a palavra chave correta, a requisição será negada.
O jwt é dividido em três partes, o header, o payload e a assinatura, eles serão explicados logo abaixo.
Header
O header será a parte em que conterá o tipo de do token e o algoritmo usado na encriptação, como HMAC,SHA256.
Payload
Aqui será a parte que conterá os dados que identificam uma entidade, como um usuário,por exemplo, podem ser armazenado qualquer tipo de informação, mas tenha cuidado com quais dados adicionar, já que algumas dessas podem ser sensíveis, como senhas.
Dentro dessas informações, deve-se conter, também, um tempo de expiração do seu token, assim ele não permanecerá válido para sempre, tendo que gerar outro token com o tempo. Isso melhora a segurança dos tokens caso ele for vazado por terceiros.
Signature
A assinatura é a palavra-chave usada para encriptar todas essas informações, tornando ela ilegível há olhos humanos. Com essa assinatura, será necessário ter a palavra-chave para descriptografar os dados e usá-los, dificultando a vida de hackers.
Depois da criptografia, o token terá essa forma,sendo cada parte é dividida por pontos:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIzMTIzMTIzMTIzIiwibmFtZSI6Ikx1Y2FzIiwiaWF0IjoxNTE2MjM5MDIyfQ.KB60RVIErmxJ-trIokhs7MmgS7TdwB90XNVrynf5SdI
Onde usar JWT
Normalmente, esse token é usado em processos de autenticação de informações. Esse token é retornado do servidor para o cliente após o usuário fazer o login de sua conta, sendo agora usada para toda requisição do cliente.
Esse token será enviado através do header da requisição com o nome de Authorization e usando um esquema bearer. Com esse token, o servidor autentica ele e, se for válido, ele retornará os dados pedidos na requisição, se não, enviará um erro de não autorização.
obs: esse token estará disponível para o cliente e, portanto, suas informações expostas para terceiros, mesmo que ilegivel, lembre-se de não colocar dados sensíveis como senhas.
Criando tokens JWT
Agora, vamos começar a criar os tokens para nossas aplicações node. Existem diversas bibliotecas que criam tokens jwt em javascript e em outras linguagens, nesse caso, usarei a biblioteca jsonwebtoken, primeiro instale a dependência.
yarn add jsonwebtoken
Essa biblioteca possui suporte a diversos algoritmos de encriptação e também é bem simples de adicioná las ao projeto.
Encriptando
Para criar o token, usaremos a função “sing” da biblioteca, essa função é dividida em três partes, os dados que você quer colocar no token(o payload), a palavra secreta, e as opções do token, como algoritmo usado, tempo de expiração,etc.
jwt.sign(payload, secretOrPrivateKey, options?);
Nesse caso, passarei como payload apenas o id do usuário, isso será usado pelo servidor para identificar qual usuário está fazendo a requisição. Poderia conter mais informações se necessário.
Além do payload, é necessário a palavra chave que assinará o nosso token e tornará ele seguro, escolha uma palavra. Quando sua aplicação for para produção, lembre-se de escolher um secret mais forte e de não passar para o seu repositório online.
Terminando, nas opções do token, colocaremos na opção expireIn um tempo de 1 hora para teste, assim, toda vez que o token tiver mais de 1 hora que foi gerado, ele será inutilizável,esse tempo de expiração é adicionado ao payload automaticamente.
Assim, apenas retorne o token junto com o resto das informações que serão passadas.
Descriptografando
Para descriptografar ele, é bem simples, você deve usar uma função da biblioteca chamada verify. Nele, passe o token como primeiro argumento e a palavra chave como segundo. O terceiro argumento será uma função callback que terão como parâmetros o erro e o token descriptografado.
jwt.verify(token, secretOrPublicKey, function callback)
Se o token for invalido, ele gerará um erro, podendo enviar para o cliente o erro. Se não, o token será válido, assim, poderá usar o id do usuário para a requisição.
O cliente deve mandar o token junto com a requisição no header dele. O campo deve estar como o nome de authorization e esquema bearer, assim, o servidor vai descriptografar ele e verificará se ele é válido.
Com esse código, você pode utilizá-lo dentro de suas rotas para autenticá-las. por exemplo, pode criar um middleware que antecede a função da rota, validar o token, e mandar junto com a requisição os dados necessários
Usando com middlewares
Caso estiver usando o express para o seu servidor, você pode criar middlewares para autenticação de maneira muito simples.
Crie uma função que recebe três parâmetros, a requisição, a resposta, e a callback next. Primeiro extraia o token do cabeçalho da requisição e depois separe o token da palavra bearer.
const jwt = require('jsonwebtoken')
function authMiddleware(req,res,next){
const {authorization} = req.headers
const [,token] = authorization.split(' ')
}
https://gist.github.com/lucasnetwork/d3a3e9be14a0234d117216538c955004#file-art14-2-js
Após isso, simplesmente descriptografe o token e valide-o, se for válido, pegue os valores do token e os adicione a requisição, depois chame a callback next.Se não for valido, retorne erro 401 com uma resposta de token invalido.
function authMiddleware(req,res,next){
const {authorization} = req.headers
const [,token] = authorization.split(' ')
jwt.verify(token,'secret',(err,decoded) =>{
if(err){
return res.status(401).json("oi") }
req.userId = decoded.id
next()
})
}
app.post("/session",authMiddleware,(req,res)=>{
req.json("ok")
})
Concluindo
Nesse artigo mostrei o que é a padronização de validação jwt e suas partes, alem disso, mostrei a biblioteca jsonwebtoken e suas principais funções para a utilização de jwts para as suas aplicações. Com isso, espero ter ajudado a entender em como utilizar os jwts, caso queira saber mais, deixarei links para mais conteúdo sobre isso.