我正在设置我认为可能是最简单的身份验证 - 网站加载在登录屏幕上,用户在表单中输入凭据,提交时我使用Passport.JS和Sequelize来检查凭据.大部分内容都是从各种教程或Passport网站本身复制而来的.无论我做什么,改变或尝试,只要我点击表单提交按钮,网站就会挂起.在开发工具网络选项卡中,我只是将/ login的发布请求显示为待处理.
为了消除所有可能出现的问题,我剥离了Sequelize,并使用了硬编码用户,ala本地使用示例在护照github页面上.尽管如此,没有改变,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函数检查用户的数据库(直接从护照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 });