2014-09-29 93 views
1

我想在RESTful环境中设置护照,并且无法让用户序列化到会话数据中。虽然登录和注册工作很好。你可以在RESTFUL环境中使用NodeJs Passport Sessions吗?

我或多或少地遵循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教程是为一个旧版本的express而编写的,我不得不做出更新以使所有内容保持最新。

回答

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

我知道我是从文档中缺少的东西:)这工作就像一个魅力。谢谢你的帮助! – Alex 2014-09-29 16:15:57

相关问题