我正在设置我认为可能是最简单的身份验证 - 网站在登录屏幕上加载,用户在表单中输入凭据,在提交时我使用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请求上加载ok。在帖子上它指向这个:
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('被引用的本地策略永远不会出现,在这一点之后我什么都不猜,甚至不重要。
还包括passport.serializeUser和passport.deserializeUser,但我无法想象这些问题在我遇到困难的阶段。
知道我缺少哪一步才能让它发挥作用?
答案 0 :(得分:32)
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
});