Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Logout (encerrar autenticação/sessão)

Olá pessoal!

No decorrer do curso foi explicado como fazer login/autenticação/criar sessão.

Seria possível explicar/disponibilizar como ficaria o código de logout (encerramento da autenticação/sessão, simulando que a rota fosse /logout) ?

Os principais arquivos/códigos de login (principais) do projeto deste curso são os seguintes:

// arquivo src/config/sessao-autenticacao.js

const uuid = require('uuid/v4');
const sessao = require('express-session');
const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;

const UsuarioDao = require('../app/infra/usuario-dao');
const db = require('./database');

module.exports = (app) => {

// configuração da sessão e da autenticação.
    passport.use(new LocalStrategy(
        {
            usernameField: 'email',
            passwordField: 'senha'
        },
        (email, senha, done) => {
            const usuarioDao = new UsuarioDao(db);
            usuarioDao.buscaPorEmail(email)
                        .then(usuario => {
                            if (!usuario || senha != usuario.senha) {
                                return done(null, false, {
                                    mensagem: 'Login e senha incorretos!'
                                });
                            }

                            return done(null, usuario);
                        })
                        .catch(erro => done(erro, false));
        }
    ));

    passport.serializeUser((usuario, done) => {
        const usuarioSessao = {
            nome: usuario.nome_completo,
            email: usuario.email
        };

        done(null, usuarioSessao);
    });

    passport.deserializeUser((usuarioSessao, done) => {
        done(null, usuarioSessao);
    });

    app.use(sessao({
        secret: 'node alura',
        genid: function(req) {
            return uuid();
        },
        resave: false,
        saveUninitialized: false
    }));

    app.use(passport.initialize());
    app.use(passport.session());


    app.use(function (req, resp, next) {
        req.passport = passport;
        next();
    });
};

No código abaixo, o código diretamente relacionado ao login corresponde ao método efetuaLogin():

// arquivo src/app/controladores/base-controlador.js

const LivroControlador = require('./livro-controlador');

const templates = require('../views/templates');

class BaseControlador {

    static rotas() {
        return {
            home: '/',
            login: '/login'
        };
    }

    home() {
        return function(req, resp) {
            resp.marko(
                templates.base.home
            );
        };
    }

    login() {

        return function(req, resp) {
            resp.marko(templates.base.login);
        };
    }

    efetuaLogin() {

        return function(req, resp, next) {

            // Lógica de login.
            const passport = req.passport;
            passport.authenticate('local', (erro, usuario, info) => {
                if (info) {
                    return resp.marko(templates.base.login);
                }

                if (erro) {
                    return next(erro);
                }

                req.login(usuario, (erro) => {
                    if (erro) {
                        return next(erro);
                    }

                    return resp.redirect(LivroControlador.rotas().lista);
                });
            })(req, resp, next);
        };
    }
}

module.exports = BaseControlador;

Obs: se acharem necessário: link do projeto completo deste curso.

Aguardo, desde já obrigado!

Atenciosamente.

1 resposta
solução!

Fala ai Elías, tudo bem? Acho que você pode fazer um req.logout() dentro da função de logout:

logout() {
    return function(req, res) {
        req.logout()
        res.redirect('/login')
    }
}

Espero ter ajudado.