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

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!

  • 142