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

Dúvida: login com o Passport

Boa tarde, estou tentando fazer um login anterior à homepage para controlar o acesso da aplicação. Pesquisando um pouco descobri o Passport, tem uma galera falando bem sobre ele, porém não consegui implementar ele dentro do modelo feito no curso.

Fiz uma tabela 'users' com os campos: 'id', 'username' e 'password'.

CREATE TABLE users (
    id INT UNSIGNED NOT NULL AUTO_INCREMENT,
    username VARCHAR(20) NOT NULL,
    password CHAR(60) NOT NULL,
        PRIMARY KEY (id),
    UNIQUE INDEX id_UNIQUE (id ASC),
    UNIQUE INDEX username_UNIQUE (username ASC))

Minha ideia é fazer uma consulta nessa tabela, caso exista o login solicitado enviar para a homepage.

Porém não consegui evoluir com ele devido a minha falta de conhecimento nessa plataforma. Alguém tem alguma ideia ou modelo de como posso inserir o Passport (ou algum outro middleware para login ) nesse projeto do curso?

Obrigado.

4 respostas

Oi Arlei, tudo bem? Vocẽ chegou a dar uma olhada na documentação? Ela já tem uns exemplos bem legais: http://passportjs.org/docs/overview

Você conseguiu entender como o passport funciona?

Opa, bom dia Wanderson. Obrigado pela resposta. Então, estou tentando seguir pelo documentação deles mas não estou tendo sucesso. O erro que acontece na execução do Node é o seguinte:

'ReferenceError: passport is not defined'

O erro acontece no arquivo das rotas, pois adicionei uma função para login. Arquivo de rota do home ficou assim:

module.exports = function(app) {
    app.get('/', function(req, res) {

        if (req.isAuthenticated()) {
            var connection = app.infra.connectionFactory();
            var produtosDAO = new app.infra.ProdutosDAO(connection);
            produtosDAO.lista(function(erros, resultados) {
                res.render('home/index', {
                    livros: resultados
                });
            });
            connection.end();
        } else {
            console.log("else");
        }
    });

    // process the login form
    app.post('/login', passport.authenticate('local-login', {
            successRedirect: '/profile', // redirect to the secure profile section
            failureRedirect: '/login', // redirect back to the signup page if there is an error
            failureFlash: true // allow flash messages
        }),
        function(req, res) {
            console.log("ok");

            if (req.body.remember) {
                req.session.cookie.maxAge = 1000 * 60 * 3;
            } else {
                req.session.cookie.expires = false;
            }
            res.redirect('/');
        });
}

O meu arquivo do express está da seguinte maneira:

var express = require('express');
var load = require('express-load');
var bodyParser = require('body-parser');
var expressValidator = require('express-validator');
var session = require('express-session');
var cookieParser = require('cookie-parser');
var morgan = require('morgan');
var flash = require('connect-flash');
var passport = require('passport'),
    LocalStrategy = require('passport-local').Strategy;

passport.use(new LocalStrategy(
    function(username, password, done) {
        User.findOne({
            username: username
        }, function(err, user) {
            if (err) {
                return done(err);
            }
            if (!user) {
                return done(null, false, {
                    message: 'Incorrect username.'
                });
            }
            if (!user.validPassword(password)) {
                return done(null, false, {
                    message: 'Incorrect password.'
                });
            }
            return done(null, user);
        });
    }
));
module.exports = function() {
    var app = express();
    app.set('view engine', 'ejs');
    app.set('views', './app/views');
    app.use(express.static('./app/public'));
    app.use(morgan('dev'));
    app.use(cookieParser());
    app.use(bodyParser.urlencoded({
        extended: true
    }));
    app.use(bodyParser.json());
    app.use(session({
        secret: 'vidyapathaisalwaysrunning',
        resave: true,
        saveUninitialized: true
    }));
    app.use(passport.initialize());
    app.use(session());
    app.use(flash());
    app.use(expressValidator());

    load('routes', {
            cwd: 'app'
        })
        .then('infra')
        .into(app);

    app.use(function(req, res, next) {
        console.log(process.env.NODE_ENV);
        res.status(404).render('erros/404');
        next();
    });

    app.use(function(error, req, res, next) {
        console.log(process.env.NODE_ENV);
        if (process.env.NODE_ENV == 'production') {
            res.status(500).render('erros/500');
            return;
        }
        next(error);
    });

    return app;
}

Acredito que estou errando em algo dentro do express, mas ainda não consegui identificar o que pode ser.

Obrigado.

solução!

Oi Arlei, pelo que vi, você não está importando o passport dentro do arquivo de rotas, mas está tentando usá-lo. Pode-se resolver isso facilmente:

var passport = require('passport');

Lembrando que se estiver utilizando sessão, você precisa configurar isso para o passport também:

app.use(passport.session());

Bom dia Wanderson, deu certo. Era isso mesmo. Eu tentei fazer dentro express.js, porém não tive sucesso. Seguindo sua dica o servidor rodou certinho novamente. Obrigado.