Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Melhor modo de persistir o token em uma aplicação final

EDIT: Por algum motivo a pergunta foi duplicada...

Desculpe se já tiver sido comentado durante o curso e não encontrei.

Mas qual seria o melhor método para guardar e enviar um token em uma aplicação final? Porque quando utilizamos uma aplicação a gente não fica dando crtl-c crtl-v no token. A aplicação utiliza o token por de baixo dos panos sem o usuário ver.

Pelo que pesquisei, uma estratégia seria guardar o token em cookies com res.cookie? Essa seria a melhor opção? ou haveria outras possibilidades?

2 respostas
solução!

Boa tarde Renan, tudo bom?

Então, quando utilizamos uma SPA (React, Angular, Vue, Svelte, etc) muitas vezes vi o pessoal persistir o token JWT no local storage e no session storage.

Abraço.

Após muita pesquisa eu acabei utilizando cookies para persistir o token no cliente. Pelo entendi, armazenar o token no local/session storage pode gerar alguns problemas de segurança sérios na aplicação. Logo, a melhor maneira que encontrei, foi utilizando cookies. Após gerar o token no servidor, basta envia-lo na resposta para o cliente e armazena-lo em um cookie.

const token = criaTokenJWT(req.user) //token criado no lado servidor
   res.set('Authorization', 'Bearer ' ,token) //envia token na resposta do servidor para o cliente
   res.cookie('meuToken','Bearer '+token,{ //salva token no cliente em um cookie
        signed: true,
        maxAge:60000*60*8,
        //secure:false, //usando server localhost que nao usa HTTPS, antes de subir para prod trocar para true
        httpOnly:true
    })  

Posteriormente, para cada requisição feita a uma rota protegida, sera necessário enviar o token no cabeçario da requisição, confome vimos na aula, onde o instrutor usou o Insominia. Mas, no meu caso, como tive que implementar isso no front-end, utilizei um middleware que é chamado antes de cada rota protegida ser acessada. Esse middleware é responsável por acessar o valor do token armazenado dentro do cookie no lado do cliente e adicionar esse token no cabeçario da requisição, da seguinte forma:

const app = require("express");
const passport = require('passport');
const cookieParser = require('cookie-parser');
const router = app.Router();

router

    .use(cookieParser(process.env.SECRET))
    .use((req,res,next) => {
        const token = req.signedCookies["meuToken"]
        req.headers.authorization = token; //aqui adicionamos o token ao cabecario da requisicao
        next();
    })
    .get('/suaRotaProtegida',passport.authenticate('bearer', {session:false}),Controller.SuaFuncao)

Dessa forma, o token pode ser verificado e validado pelo servidor para tornar a rota protegida.