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

Erro! Sessões de login requerem suporte de sessão

Implementei as alterações realizadas na aula 2 videos 06 e 07. Estou recebendo esse erro na hora de fazer o post em /usuario/login

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="utf-8">
    <title>Error</title>
</head>

<body>
    <pre>Error: Login sessions require session support. Did you forget to use `express-session` middleware?<br> &nbsp; &nbsp;at SessionManager.logIn (C:\Users\rafael.mello\Documents\API nodejs\CRUD pronto para JWT\node_modules\passport\lib\sessionmanager.js:21:33)<br> &nbsp; &nbsp;at IncomingMessage.req.login.req.logIn (C:\Users\rafael.mello\Documents\API nodejs\CRUD pronto para JWT\node_modules\passport\lib\http\request.js:39:26)<br> &nbsp; &nbsp;at Strategy.strategy.success (C:\Users\rafael.mello\Documents\API nodejs\CRUD pronto para JWT\node_modules\passport\lib\middleware\authenticate.js:256:13)<br> &nbsp; &nbsp;at verified (C:\Users\rafael.mello\Documents\API nodejs\CRUD pronto para JWT\node_modules\passport-local\lib\strategy.js:83:10)<br> &nbsp; &nbsp;at Strategy._verify (C:\Users\rafael.mello\Documents\API nodejs\CRUD pronto para JWT\src\usuarios\estrategias-autenticacao.js:31:13)</pre>
</body>

</html>

partes do codigo alteradas: usuarios-rotas

app
    .route('/usuario/login')
    .post(passport.authenticate('local', { sessions : false }), usuariosControlador.login)

usuarios-controlador

login: (req, res) => {
    res.status(204).send();
  },

./usuarios/index.js

module.exports = {
  rotas: require('./usuarios-rotas'),
  controlador: require('./usuarios-controlador'),
  modelo: require('./usuarios-modelo'),
  estrategiasAutenticacao: require('./estrategias-autenticacao')
}

estrategias-autenticacao

const passport = require('passport')
const { InvalidArgumentError } = require('../erros')
const LocalStrategy = require('passport-local').Strategy
const Usuario = require('./usuarios-modelo')
const brcrypt = require('bcrypt')

function verificaUsuario(usuario) {
    if(!usuario) {
        throw new InvalidArgumentError('Não foi possível encontrar um usuário com esse email!');
    }
}

async function verificaSenha(senha, senhaHash) {
    const senhaValida = await brcrypt.compare(senha, senhaHash)
    if(!senhaValida) {
        throw new InvalidArgumentError('E-mail ou senha inválidos')
    }
}

passport.use(
    new LocalStrategy({
        usernameField: 'email',
        passwordField: 'senha',
        sessions: false
    }, async (email, senha, done) => {
        try {
            const usuario = await Usuario.buscaPorEmail(email)
            verificaUsuario(usuario);
            await verificaSenha(senha, usuario.senhaHash)

            done(null, usuario)
        } catch (erro) {
            done(erro);
        }
    })
)
13 respostas

Olá,

Olhando a mensagem faltou colocar o express-session, Dá uma olhada neste link https://www.npmjs.com/package/express-session

Beleza?

Olá Flavio, tudo ótimo e aí?

Eu estava olhando a documentação dele aqui já, mas achei estranho que o instrutor não comentou nada sobre durante o curso...

Humm,

Vc está na mesma versão? Fez alguma coisa diferente?

Já reassisti os videos dessa aula algumas vezes e acredito que esteja tudo certo, usei os comandos de install que são passados no curso também

Vou deixar minhas dependencias do projeto aqui também, caso alguem queira conferir...

"dependencies": {
    "bcrypt": "^5.0.1",
    "body-parser": "^1.19.0",
    "dotenv": "^16.0.1",
    "express": "^4.17.1",
    "express-session": "^1.17.3",
    "jsonwebtoken": "^8.5.1",
    "nodemon": "^2.0.2",
    "passport": "^0.6.0",
    "passport-http-bearer": "^1.0.1",
    "passport-local": "^1.0.0",
    "redis": "^4.2.0",
    "sqlite3": "^5.0.10"
  }

Conferi a versão do passport utilizada no video e realmente estava diferente! Usei:

npm install passport@0.4.1

Porem não resolveu o problema, o erro agora é outro, segue:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="utf-8">
    <title>Error</title>
</head>

<body>
    <pre>Error: passport.initialize() middleware not in use<br> &nbsp; &nbsp;at IncomingMessage.req.login.req.logIn (C:\Users\rafael.mello\Documents\API nodejs\CRUD pronto para JWT\node_modules\passport\lib\http\request.js:46:34)<br> &nbsp; &nbsp;at Strategy.strategy.success (C:\Users\rafael.mello\Documents\API nodejs\CRUD pronto para JWT\node_modules\passport\lib\middleware\authenticate.js:253:13)<br> &nbsp; &nbsp;at verified (C:\Users\rafael.mello\Documents\API nodejs\CRUD pronto para JWT\node_modules\passport-local\lib\strategy.js:83:10)<br> &nbsp; &nbsp;at Strategy._verify (C:\Users\rafael.mello\Documents\API nodejs\CRUD pronto para JWT\src\usuarios\estrategias-autenticacao.js:31:13)</pre>
</body>

</html>

Que coisa hein,

Não tens o seu código num github?

Tenho, acabei de publicar, link pro código: https://github.com/Siqm/CRUD-pronto-para-JWT

Oi,

Eu acho que tens ver a questão do passort, me parece que não inicializado corretamente, nunca utilizei, então sei dizer exatamente o que precisa ser feito, mas dando uma olhada na documentação me parece que falta alguns passos.

Dei uma olhada na documentação mas ainda não consegui resolver o problema...

solução!

Oi Rafael,

Dá uma olhada no seu arquivo usuarios-rotas , na linha do post tenta alterar sessions para session

app
    .route('/usuario/login')
    .post(passport.authenticate('local', { session : false }), usuariosControlador.login)

Você é um GENIO contemporaneo meu amigo, funcionou! Muito obrigado

Que bom que resolveu, sucesso nos seus estudos :)

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software