我试图在RESTful环境中设置护照,并且无法让用户序列化到会话数据中。登录和注册工作很棒。
我或多或少地遵循scotch.io的教程,但我做了一些调整,以便通过RESTful API工作。
简而言之,这是我的服务器设置:
var express = require("express"); // v 4.8.5
var cookieParser = require("cookie-parser"); // v 1.3.3
var bodyParser = require("body-parser"); // v 1.9.0
var session = require("express-session"); // v 1.8.2
var passport = require("passport"); // v 0.2.1, passport-local is v 1.0.0
var app = express();
require("./config/Passport")(passport);
app.use( morgan('dev') );
app.use( cookieParser(secret) );
app.use( bodyParser.json() );
app.use( bodyParser.urlencoded({extended:true}) );
app.use( session({secret:secret, resave:true, saveUninitialized:true, cookie:{httpOnly: false, secure:false, maxAge:cookie_max_age}}) );
app.use( passport.initialize() );
app.use( passport.session() );
app.use( less(publicPath, {compiler:{compress:false}}) );
app.use( express.static(publicPath) );
var router = express.Router();
require( appBase + "Routes" )(router, passport);
app.use( '/api', router );
var server = app.listen(8088);
现在,在我的路由器中,我已经按如下方式定义了登录路由:
router.post("/login", function(req, res, next)
{
passport.authenticate("local-login", function(error, user, info)
{
if(error) return next(error);
if(!user) return response.send({success:false, message:info.message});
return response.send({success:true, message:"Login successful.", user:user});
})(request, response, next);
});
我想在这里做一些简短的介绍,但我的用户序列化和反序列化功能中也有控制台跟踪,但它们并没有受到影响。我也有一些日志记录向我展示了会话变量的用途,并且几乎没有显示任何内容。
表示Cookie信息中有一个护照变量,但它是空的。我猜测我的问题在于我没有使用默认的重定向机制,默认情况下应该使用护照,但到目前为止,我还是无法计算究竟是什么。我的第二个猜测是cookie和会话内容没有正确设置。 scotch.io教程是为更旧版本的快递编写的,我必须进行更改才能使所有内容都更新。
答案 0 :(得分:2)
没有"重定向"的默认机制,尽管为方便起见提供了一个。
您正在使用自定义回调,因此我怀疑问题是由于根本没有调用req.login()
引起的。如上所述in the documentation
请注意,使用自定义回调时,应用程序负责建立会话(通过调用
req.login()
)并发送回复。
所以,试试它是否会像这样工作:
router.post("/login", function(req, res, next)
{
passport.authenticate("local-login", function(error, user, info)
{
if(error) return next(error);
if(!user) return res.send({success:false, message:info.message});
req.logIn(user, function(err) {
if(error) return next(error);
return res.send({success:true, message:"Login successful.", user:user});
}
})(req, res, next);
});