@WellsSA
@WellsSA
@WellsSA
"Autenticação usando Tokens"
@WellsSA
@WellsSA
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
Segurança e privacidade
Acessos
Logging/Auditoria
@WellsSA
@WellsSA
@WellsSA
Você
servidor
"Tá logado?
tem ID?
Nível de acesso?"
@WellsSA
@WellsSA
Você
servidor
"Tem login e senha, sei quem é"
(login, senha)
(acesso à página)
@WellsSA
Você
servidor
"Tem login e senha, sei quem é"
(login, senha)
(acesso à página)
Você
servidor
"Quem é você?"
(qualquer outra requisição)
@WellsSA
Não!
@WellsSA
@WellsSA
Autenticação
@WellsSA
Você
servidor
"Tá logado?
tem ID?
Nível de acesso?"
@WellsSA
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
@WellsSA
@WellsSA
Só teoria
Teoria
+
Prática
Você
servidor
Session_id: 123
User_ID: 2
Session
@WellsSA
Você
servidor
Session_id: 123
User_ID: 2
Session
@WellsSA
Você
load balancer
Session
(session_cookie)
@WellsSA
@WellsSA
Você
load balancer
Session
(session_cookie)
@WellsSA
@WellsSA
@WellsSA
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
@WellsSA
Você
load balancer
Session
Você
load balancer
(token)
(token)
(login)
@WellsSA
@WellsSA
@WellsSA
@WellsSA
(JSON Web Token)
"(...) é 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
"abcd.1234.abcd1234"
@WellsSA
@WellsSA
@WellsSA
Tópico extra, pra quem tiver curiosidade
@WellsSA
JSON é um formato de texto que facilita a troca de dados estruturados!
@WellsSA
[
{
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
Informação útil
Token criptografado
@WellsSA
servidor
Texto
Informação útil
Token criptografado
Texto
Você
load balancer
(login)
(token)
@WellsSA
Você
load balancer
(token)
@WellsSA
@WellsSA
@WellsSA
@WellsSA
@WellsSA
@WellsSA
@WellsSA
@WellsSA
@WellsSA
@WellsSA
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
@WellsSA