我尝试了您的代码,并且在Passport方面有效。我先进行了“本地注册”,“注销”,然后进行了“本地登录”,并成功通过了身份验证,但是在用户界面中没有任何指示。
这与您正在讨论的302有关-服务器回答302因为您已定义
successRedirect :'/profile',然后jQuery遵循了重定向并接收到HTML,该HTML无法解析,因为它需要JSON。而且由于您没有
.fail()在
$.ajax呼叫中定义回调,所以看不到它。
会话正常,但可以手动转到
/profile。
当您使用常规HTML表单登录时,浏览器将发送一个HTTP请求并根据响应进行操作(例如,呈现HTML页面,或者如果是302,则执行重定向)。发生相同的情况,但调用时上下文不同
$.ajax-AJAX调用遵循重定向,因为它发出了请求,但浏览器没有。
您应该为AJAX和HTML登录使用单独的路由,或者使用自定义回调并根据确定返回的内容
req.accepts()。
分开的路线可以是例如。
// AJAX logins to this URL, redirect on client side using// window.location.href if login succeedsapp.post('/login/ajax', passport.authenticate('local-login'));// HTTP login form send to this URLapp.post('/login', passport.authenticate('local-login', { successRedirect : '/profile', failureRedirect : '/login', failureFlash : true}));自定义回调可能是这样的(未经测试):
app.post('/login', function(req, res, next) { passport.authenticate('local-login', function(err, user, info) { switch (req.accepts('html', 'json')) { case 'html': if (err) { return next(err); } if (!user) { return res.redirect('/login'); } req.logIn(user, function(err) { if (err) { return next(err); } return res.redirect('/profile'); }); break; case 'json': if (err) { return next(err); } if (!user) { return res.status(401).send({"ok": false}); } req.logIn(user, function(err) { if (err) { return res.status(401).send({"ok": false}); } return res.send({"ok": true}); }); break; default: res.status(406).send(); } })(req, res, next); });


