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.