Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

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 :)