你可以在RESTFUL环境中使用NodeJs Passport Sessions吗?

我正在尝试在RESTful环境中设置护照,并不能让用户序列化到会话数据中。 虽然login和注册工作很好。

我或多或less地遵循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); 

现在,在我的路由器中,我已经定义了login路由,如下所示:

 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); }); 

我试图在这里简要介绍一下,但是我的用户序列化和反序列化function中也有控制台痕迹,而且没有被打到。 我也有一些日志logging,告诉我会话variables是怎么回事,而且几乎没有任何显示。 cookie信息中有一个护照variables,但是它是空的。

我猜我的问题在于,我没有使用默认的默认使用默认的redirect机制,但到目前为止,我一直无法弄清楚它到底是什么。 我的第二个猜测是cookie和会话的东西没有得到正确的设置。 scotch.io教程是为了更老的版本而编写的,我不得不进行更新,以便将所有内容都更新到最新版本。

没有“redirect的默认机制”,尽pipe为了方便您提供了一个。

您正在使用自定义callback,所以我怀疑问题是由于根本不调用req.login() 。 正如文件中所述

请注意,使用自定义callback时,应用程序负责build立会话(通过调用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); });