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

时间:2014-09-29 00:58:30

标签: node.js rest session cookies passport.js

我试图在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教程是为更旧版本的快递编写的,我必须进行更改才能使所有内容都更新。

1 个答案:

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