javascript - Passport 验证不重定向

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

我正在编写一个本地注册策略,发现它不起作用,所以我退后一步,尝试针对我的空集合进行身份验证。每次我提交表单都会花费大约 30-40 秒的时间,直到导致超时。我确保调用了 Passport.authenticate() ,但它似乎没有执行任何重定向,因此它超时了,因为我也没有渲染某些内容。

问题:

  1. 我预计它会重定向到 failureUrl(即“/signup”),但什么也没发生。我在这里做错了什么?
  2. 为什么没有来自 Passport 的单一日志消息?这让我发疯,因为我完全不知道那里出了什么问题。
  3. 我是 Node.js 的新手,据我所知,我不需要将配置的 Passport 对象传递给路由器,而是我可以执行 const Passport = require('passport') 正确吗?

这是我的/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 PM - info: POST request received 7:32:04 PM - info: username=dassd@dass.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

最佳答案

快速查看 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() 返回的函数。

关于javascript - Passport 验证不重定向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43834707/

相关文章:

javascript - 在 JavaScript 中发送十进制值

javascript - 如何在循环中保存对象的 'previous' 和 'next' 迭代?

javascript - 多个 var 是 node app.js

node.js - SampleTransaction 类型未定义

javascript - 前端的 Meteor,后端的 Express (NodeJS)

jquery - 如何从 Express 服务器中的远程服务器获取 JSON?

javascript - 谷歌地图标记不显示

javascript - ReactJS firebase.initializeApp 不是函数

javascript - MongoDB:如何创建一个具有对象数组作为字段的对象?

javascript - 我可以渲染动态内容并使用模板引擎(ejs)吗