Stateless X Stateful - Autenticação JWT no NodeJS
@WellsSA
@WellsSA
Wellington S. Almeida
- Senior Software Engineer at @Holonic (Sillicon Valey)
- Community Manager at @EW.it
- Community Manager at @FlutterNation
- Ex-CTO & Co-founder at @Envia.io
- Designer, maybe?
-
Speaker? @icarcal - Music? Let's Rock!
@WellsSA

"Autenticação usando Tokens"
Geralmente ouvimos falar de
@WellsSA
Mas, antes de tudo
O que é Autenticação?
@WellsSA
Na definição
Autenticação
(do grego : αυθεντικός = real ou genuíno, de 'authentes' = autor) é o ato de estabelecer ou confirmar algo (ou alguém) como autêntico"
@WellsSA
Autenticação

Isso é muito importante
Segurança e privacidade
- Para ver as informações, precisa autenticar
Acessos
- Quais informações pode ver/criar/apagar?
- Pode ver/criar/apagar informações?
Logging/Auditoria
- Quem está vendo/criando/apagando informações?
@WellsSA
@WellsSA
Então agora sabemos que: Autenticação é importante

E existem várias formas de autenticação
@WellsSA


Você
servidor

"Tá logado?
tem ID?
Nível de acesso?"
Usando um exemplo simples
@WellsSA
@WellsSA
Precisamos de autenticação

Você
servidor

"Tem login e senha, sei quem é"
(login, senha)
(acesso à página)
@WellsSA
E também salvar a autenticação

Você
servidor

"Tem login e senha, sei quem é"
(login, senha)
(acesso à página)

Você
servidor

"Quem é você?"
(qualquer outra requisição)
@WellsSA
Preciso de login e senha toda vez?

Não!
E como fazemos isso?
@WellsSA
Um meio inteligente de autenticar o usuário
O que precisamos é

@WellsSA
Stateless
X
Stateful
E é aí que entra o tema da palestra
Autenticação
@WellsSA
Voltando pro nosso exemplo

Você
servidor

"Tá logado?
tem ID?
Nível de acesso?"
@WellsSA
Podemos usar variáveis de sessão

Você
servidor

(login, senha)
(acesso à página)

Você
servidor

"Esse é o usuário do Session_id: 123"
(qualquer outra requisição)
Session_id: 123
User_ID: 2
Session
@WellsSA
E é isso
Fim da palestra

@WellsSA
Ainda não, caaalma

Pegadinha
@WellsSA

Só teoria
Teoria
+
Prática
Na teoria

Você
servidor

Session_id: 123
User_ID: 2
Session
@WellsSA
Na prática
ex.:

Você
servidor

Session_id: 123
User_ID: 2
Session





@WellsSA
Temos alguns problemas

Você
load balancer

Session



(session_cookie)


@WellsSA
Isso é
@WellsSA
Autenticação
Stateful
O servidor salva um estado

Você
load balancer

Session



(session_cookie)


@WellsSA
@WellsSA
Mas e como raios é a Stateless?

OK, isso é Stateful
@WellsSA
Imagina só

Você
servidor

(login, senha)
(acesso à página + chave)

Você
servidor

"Esse é o usuário
{ User_ID: 2 }"
(qualquer outra requisição + chave)
{ User_ID: 2 }
Chave criptografada
@WellsSA
Em termos técnicos
"chave criptografada"
"token"
E por que isso é tão útil?
Porque no Stateful
@WellsSA

Você
load balancer

Session





Enquanto no Stateless

Você
load balancer




(token)



(token)
(login)
E isso serve pra muita coisa!


@WellsSA
✅ Autenticação Stateful
✅ Autenticação Stateless
Então já sabemos o que é
Mas....
@WellsSA
O que é JWT?
@WellsSA
@WellsSA

JWT
(JSON Web Token)
- Web Token que armazena objetos JSON
- Permite a autenticação de uma requisição
"(...) é um método RCT 7519 padrão da indústria para realizar autenticação entre duas partes por meio de um token assinado que autentica uma requisição web"
(Fonte: DevMedia)
@WellsSA
@WellsSA

Basicamente
"abcd.1234.abcd1234"
@WellsSA
Um meio inteligente de autenticar o usuário
Esse é

@WellsSA
✅ Autenticação Stateful
✅ Autenticação Stateless
Agoooora sim já sabemos
✅ e JWT
@WellsSA
Por que JSON Web Token?
Tópico extra, pra quem tiver curiosidade
@WellsSA
JSON é um formato de texto que facilita a troca de dados estruturados!
Porque
@WellsSA
O que é JSON?
[
{
nome: "Wellington",
idade: 20,
amigos: ["Kaleo", "Lucas"],
},
{
nome: "Kaleo",
idade: 21,
amigos: ["Lucas", "Wellington"],
},
]
"[{"nome":"Wellington","idade":20,"amigos":["Kaleo","Lucas"]},{"nome":"Kaleo","idade":21,"amigos":["Lucas","Wellington"]}]"
Objeto
X
Texto
(JavaScript Object Notation)
Objeto
Texto
Objeto
@WellsSA
Com o JSON
Informação útil
Token criptografado
@WellsSA
E usando o JSON Web Token
servidor

Texto
Informação útil
Token criptografado
Texto
Ou seja

Você
load balancer


(login)
(token)
@WellsSA
Ou seja

Você
load balancer




(token)



@WellsSA
@WellsSA
✅ Autenticação Stateful
✅ Autenticação Stateless
Agoooora sim já sabemos
✅ JSON e JWT
@WellsSA
Dicas extras especiais
- Atenção ao tamanho do "secret" escolhido, ele vai ser usado para criptografar/descriptografar informações em quase toda request
- Defina sempre um tempo de expiração pros seus JWTs, assim se eles forem "roubados", o atacante tem um tempo limitado para agir
Bora codar!
@WellsSA

Criando um server com Express
@WellsSA

Definindo as Configurações
@WellsSA

Rota de Login
@WellsSA
Rota de Login

Exemplo de resposta
@WellsSA
Middleware de Autenticação

@WellsSA
A ordem das rotas importa!



@WellsSA
Código completo

const express = require('express');
const cors = require('cors');
const jwt = require('jsonwebtoken');
const app = express();
app.use(cors({ origin: '*' }));
app.use(express.json());
const config = {
secret: 'palestraJWTSKKAsdo@22s',
expiresIn: '1h',
};
app.post('/login', (req, res) => {
// email/password verification to find user
const user = { id: 10 };
return res.json({
user,
token: jwt.sign({ id: user.id }, config.secret, {
expiresIn: config.expiresIn,
}),
});
});
const authMiddleware = (req, res, next) => {
const { authorization } = req.headers;
// 1. Verify if the authorization header was provided
if (!authorization) {
return res.status(401).json({ error: 'Missing authorization' });
}
// 'Bearer token123'
const [_, token] = authorization.split(' ');
try {
// 2. Verify if there is a valid token
const decoded = jwt.verify(token, config.secret);
req.userID = decoded.id;
// 3. If everything is okay, continue to the next middleware
next();
} catch (error) {
console.log(error);
if (error.name === 'JsonWebTokenError')
return res.status(401).json({ error: 'Invalid token provided' });
return res.status(500);
}
};
app.get('/non-protected', (req, res) => res.json({ ok: true }));
app.use(authMiddleware);
app.get('/protected', (req, res) => res.json({ ok: true }));
const port = 3002;
app.listen(port, () => console.info(`🚀 Server running on port ${port}...`));
@WellsSA
Wellington S. Almeida

@WellsSA
- Instagram:
@wells.sa -
Slides:
https://slides.com/WellsSA - Código: https://github.com/WellsSA
-
Contatos:
https://wellsadev.com/
Stateless X Stateful - entenda Autenticação JWT no NodeJS
By Wellington Almeida
Stateless X Stateful - entenda Autenticação JWT no NodeJS
Muito provavelmente você já ouviu falar em Autenticação usando JSON Web Token (JWT) no NodeJS, mas você já parou pra se perguntar quais as vantagens dessa implementação, por que ela ficou tão popular, e quais os impactos disso em servidores reais na nuvem? /* -- */ Então vem que nessa palestra você vai entender um pouco mais sobre o que é autenticação stateful e stateless e ter as respostas pra essas e mais perguntas, entendendo como a autenticação era feita no passado e como ela é feita atualmente; analisando quais as vantagens em termos de balanceamento de carga e, com isso, percebendo a importância do JWT pra web moderna!
- 245