Passport Authenticate不会重定向

时间:2017-05-07 17:46:45

标签: javascript node.js express passport.js passport-local

我正在写一个本地注册策略并注意到它不起作用所以我退后一步,尝试对我的空集合进行身份验证。每次我提交表单都需要大约30-40秒才能导致超时。我确保调用了passport.authenticate(),但似乎它没有做任何重定向,因此它超时,因为我也没有渲染。

问题:

  1. 我预计它会重定向到failureUrl(这是'/ signup'),但没有发生任何事情。我在这做错了什么?
  2. 为什么没有来自护照的单一日志消息?这让我抓狂,因为我完全不知道那里出了什么问题。
  3. 我是node.js的新手,据我所知,我不需要将配置的护照对象传递给路由器,而是我可以const passport = require('passport')这是正确的吗?
  4. 这是/ signup路由的函数处理程序:

    function processSignup (req, res) {
        logger.info("POST request received")
        logger.info(req.body)
        passport.authenticate('local', {
            successRedirect : '/profile', // redirect to the secure profile section
            failureRedirect : '/signup', // redirect back to the signup page if there is an error
            failureFlash : true // allow flash messages
        })
    }
    

    Winston打印:

      

    下午7:32:04 - 信息:POST请求收到时间:下午7:32:04 - 信息:   username = dasass @ das.de,password = dasdsa,submit = Register

    我的passport.js文件如下所示:

    const LocalStrategy = require('passport-local').Strategy
    const User = require('./user-model')
    const passport = require('passport')
    
    // expose this function to our app using module.exports
    function config() {
        passport.serializeUser(function(user, done) {
            done(null, user.id)
        })
    
        // used to deserialize the user
        passport.deserializeUser(function(id, done) {
            User.findById(id, function(err, user) {
                done(err, user)
            })
        })
    
        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 = {
        config: config
    }
    

    相关剪辑我的app.js:

    // required for passport
    require('./authentication/passport').config();
    app.use(cookieParser())
    app.use(bodyParser())
    app.use(session({ 
        secret: 'secretToBeChanged',
        saveUninitialized: false,
        resave: false
    }))
    app.use(passport.initialize())
    app.use(passport.session()) // persistent login sessions
    app.use(flash()) // use connect-flash for flash messages stored in session
    

1 个答案:

答案 0 :(得分:2)

快速查看passportjs的文档后,我认为你需要做这样的事情:

function processSignup (req, res, next) {
    logger.info("POST request received")
    logger.info(req.body)
    const handler = passport.authenticate('local', {
        successRedirect : '/profile', // redirect to the secure profile section
        failureRedirect : '/signup', // redirect back to the signup page if there is an error
        failureFlash : true // allow flash messages
    });
    handler(req, res, next);
}

passport.authenticate()返回一个用作路由处理函数的函数 通常,您可以键入以下内容:

app.post('/login', passport.authenticate('local', {
  successRedirect: '/',
  failureRedirect: '/login',
  failureFlash: true 
}));

但是由于您使用自己的路由处理函数进行了抽象,因此需要调用从passport.authenticate()返回的函数。