我正在设置我认为可能是最简单的身份验证-网站在登录屏幕上加载,用户以表单形式输入凭据,提交后,我正在使用Passport.JS和Sequelize来检查凭据。所有这些内容大部分都是从各种教程或Passport网站本身复制而来的。
无论我做什么,进行更改或尝试,只要单击表单提交按钮,该网站就会立即挂起。在“开发工具”网络标签中,我仅将对/login的发布请求显示为待处理。

为了消除所有可能出现的问题,我删除了Sequelize,并使用了硬编码的用户,例如passport github page上的本地使用示例。不过,对Sequelize进行更改没有任何问题。

我敢肯定这是愚蠢的。我已经尝试了显而易见的解决方案,例如确保我的表单正在发送“用户名”和“密码”。

我的表格如下所示:

form(method="post", action="/login")
  fieldset
    legend Please Log In
    label(for="username") Username:
    input#username(type='text', name="username", autocomplete="off")
    label(for="password") Password:
    input#password(type='password', name="password")
    button#login(type="submit") Log In

在节点中,我的app.js使用路由器,其中包括:
var login = require('../app/controllers/login');
app.get('/', login.index);
app.post('/login', login.auth);

页面在get请求上加载正常。在发布时,它直接指向:
exports.auth = function (req, res, next) {
  console.log(req.body);
   passport.authenticate('local', {
    successRedirect: '/home',
    failureRedirect: '/',
    failureFlash: true
  });
};

console.log(req.body)可以很好地显示表单值,因此我们可以确定。但是之后没有。这是最后一部分:
passport.use(new LocalStrategy(
  function(username, password, done) {
    console.log('local strat invoked');
    findByUsername(username, function(err, user) {
      if (err) { return done(err); }
      if (!user) { return done(null, false, { message: 'Unknown user ' + username }); }
      if (user.password != password) { return done(null, false, { message: 'Invalid password' }); }
      return done(null, user);
    });
  }
));

我换出了使用Sequelize来使用此findByUsername函数检查用户数据库的代码(直接从 Passport github页面上的上述帖子复制并粘贴),但是作为console.log('local strat invoked')是永远不会出现,在那之后我想都没想到。

还包括passport.serializeUser和passport.deserializeUser,但我无法想象在卡住的阶段这些是问题所在。

知道我要执行此操作缺少什么步骤吗?

最佳答案

Passport是中间件,如果将其嵌入到路由处理程序函数中,则需要调用它:

exports.auth = function (req, res, next) {
  console.log(req.body);
  passport.authenticate('local', {
    successRedirect: '/home',
    failureRedirect: '/',
    failureFlash: true
  })(req, res, next);  // <-- NEED TO INVOKE WITH req, res, next
};

或者,更简单地将其用作中间件(推荐的方法:
exports.auth = passport.authenticate('local', {
  successRedirect: '/home',
  failureRedirect: '/',
  failureFlash: true
});

关于node.js - 更多Passport.js麻烦-卡在表单提交上,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20626183/

10-13 02:26