【问题标题】:Passport.js only redirect to failure page, without calling the LocalStrategyPassport.js 只重定向到失败页面,不调用 LocalStrategy
【发布时间】:2014-01-02 17:46:53
【问题描述】:

我的 Express.js 小型应用程序中的 Passport.js 一直存在问题:无论我在 LocalStrategy 中放入什么,我总是被重定向到 failureRedirect,显然甚至没有通过 LocalStrategy... 我做错了什么?以及如何打印/显示最大的错误日志以跟踪执行?

var express = require('express'),
  passport = require('passport'),
  LocalStrategy = require('passport-local').Strategy;
  http = require('http'),
  path = require('path'),
  mysql = require('mysql'),
  flash = require('connect-flash');
var app = express();

// SQL connexion
var sqlInfo = {
  host: 'localhost', 
  user: 'root',
  password: '', 
  database: 'mex'
};
global.client = mysql.createConnection(sqlInfo);
client.connect(function(err) {
    if(err)
        console.log(err);
});

app.configure(function(){
    app.set('views', __dirname+'/views');
    app.set('port', process.env.PORT || 85);
    //app.engine('ejs', engine);
    app.use(express.static('public'));
    app.use(express.cookieParser());
    app.use(express.bodyParser());
   // 1 - Session express
    app.use(express.session({ secret: 'secretpass' }));
    // 2 - Init et session Passeport
    app.use(passport.initialize());
    app.use(passport.session());

    app.use(flash());
    app.use(express.logger());

    app.use(app.router);

});

// Simple logger
app.use(function(req, res, next){
  console.log('%s %s', req.method, req.url);
  next();    

passport.use(new LocalStrategy(
    function(username, password, done) {
        console.log("localstrategy ---");
        var user = {username: 'w@j.fr', password: 'pwd'};
        return done(null, user);
}));

passport.serializeUser(function(user, done) { 
  // JUST 4 TEST
  done(null, user);
});

passport.deserializeUser(function(user, done) { 
  // JUST 4 TEST
  done(null, user);
});

// Home
app.get('/', function(req, res){
    //check user session value, is logged in 
    if(req.user)
        res.render('menu_log.ejs', function(err, html){

            var data = {
                title: 'Home',
                menu: html
                //req.user['Prenom'] -- à afficher
            };
            res.render('index.ejs', data);

            console.log("index logué");
        });
    else
        res.render('menu_nolog.ejs', function(err, html){

            var data = {
                title: 'Home',
                menu: html
            };
            res.render('index.ejs', data);

            console.log("index PAS logué");
        });
});

// Passport's authentication
app.post('/login',
    passport.authenticate('local', { successRedirect: '/',
                                   successFlash: 'Bienvenue !',
                                   failureRedirect: '/wrong',
                                   failureFlash: "Email ou mot de passe incorrect." })
);

app.get('/logout', function(req, res){

    req.logout();
    res.redirect('/');
})

.get('/inscription', function(req, res){

    res.render('menu_nolog.ejs', function(err, html){

        var data = {
            title: 'Register',
            menu: html
        };

        res.render('inscription.ejs', data);
    });
});

http.createServer(app).listen(app.get('port'), function () {
    console.log('Express server listening on port ' + app.get('port'));
});

【问题讨论】:

    标签: javascript node.js express passport.js


    【解决方案1】:

    LocalStrategy 需要两个参数(作为 POST 数据传递,或在查询字符串中传递):usernamepassword。如果你没有通过这两个,Passport 甚至都不会费心调用策略处理程序。

    可以通过将对象作为第一个参数传递给LocalStrategy 构造函数来配置字段名称:

    passport.use(new LocalStrategy({
      usernameField : 'username',
      passwordField : 'password'
    }, function(username, password, done) { ... }));
    

    【讨论】:

    • 谢谢,但即便如此它还是失败了
    • 参数的规格是可选的,只是你想改名字(这里是默认的),嗯,我明白了
    • @user3154516 是的,它是可选的,抱歉没有说清楚 :) 所以你是 POSTing 到 /login 使用正确的参数并且没有调用策略处理程序?跨度>
    • 当我尝试登录时,它会转到 /login,并将我重定向到 failureRedirect: '/wrong' 而不传递策略处理程序(好吧,当我在其中询问 console.log 时没有任何反应...... )
    • 好的!但我不知道为什么......我最初的策略处理程序是passport.use(new LocalStrategy({ usernameField: 'mail', passwordField: 'pwd' }, function(username, password, done) { console.log("Appel de check_auth_user"); return check_auth_user(username,password,done); } ));,我的表单字段是“mail”和“pwd”。现在我已经删除了字段规范并输入了初始的“用户名”和“密码”,它可以工作了......非常感谢您的时间和帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-23
    • 2015-01-26
    • 1970-01-01
    • 2015-02-17
    • 1970-01-01
    相关资源
    最近更新 更多