如何在node.js passport身份验证中访问POST数据?

3

我正在尝试使用passport提交登录表单后访问POST参数。我的表单如下:

<form method="post">
    <input name="username">
    <input name="password">
    <input type="checkbox" name="remember" value="1">
    <input type="submit">
</form>

(工作中的)快速路线/回调:

app.post(
    '/login', 
    passport.authenticate('local', {
        failureRedirect: '/login', 
        failureFlash: true, 
        badRequestMessage: 'Please enter your account credentials to login.'
    }), 
    function(req, res) {
        console.log(req.param('remember'));
        if(req.isAuthenticated(req, res)) {
            res.redirect('/dashboard');
        } else {
            var errors = req.flash('error');
            if(errors) {
                assign['errors'] = errors;
            }
            res.render('login.html', {errors: errors});
        }
    }
);

登录正常,一切都很好。但是:req.param('remember') 总是 undefined。当我删除passport.authenticate() 部分,在我的表单中选中复选框并提交表单后,控制台会正确记录1

那么,当我同时使用passport.authenticate()时,如何访问POST参数呢?


你的代码在我这边看起来可行,尝试升级你的 Express 和 Passport 库吧!我已经进行了测试。 - drinchev
啊,我在代码中还有另一个/login路由稍高一点的位置。现在req.param('remember')正常工作了,但是我仍然无法在那个路由中访问用户名和密码字段。当我尝试访问req.param('username')req.param('password')时,用户名和密码都是未定义的。可能是因为passport在检查完参数后删除了它们吗? - Manuel Bieh
不,参数将原样传递...调试整个req变量:console.log(req) - drinchev
1个回答

1

到目前为止还没有使用过护照,但以下两点可能会导致您的问题:

1. 您的表单没有 action 属性

因此,表单不知道要将数据发送到哪里。请尝试以下操作:

<form method="post" action="/login">
  <input name="username">
  <input name="password">
  <input type="checkbox" name="remember" value="1">
  <input type="submit">
</form>

2. 在Express中,POST变量附加在req.body对象上

因此,不需要使用

console.log(req.param('remember'));

使用

console.log(req.body.username);

请确保您的express配置中有bodyParser

req.param用于访问动态路由。

app.get('/login/:user', function(req, res) {
  console.log(req.params.user)
})

// GET /login/john => 'john'

抱歉,在这个例子中我忘记了action属性。在我的模板中它当然存在 ;) - Manuel Bieh
1
配置Express bodyParser仍然是必需的吗? - ahsteele

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接