node.js - 您可以在 RESTFUL 环境中使用 NodeJs Passport Session 吗?

标签 node.js rest session cookies passport.js

我正在尝试在 RESTful 环境中设置 Passport ,但无法完全让用户序列化到 session 数据中。不过,登录和注册效果很好。

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

我试图在这里简短说明,但我在用户序列化和反序列化函数中也有控制台跟踪,并且它们没有受到影响。我还有一些日志记录来显示 session 变量发生了什么,但也几乎没有显示任何内容。 cookie信息中有一个passport变量,但它是空的。

我猜我的问题在于我没有使用默认情况下应该使用的默认重定向机制,但到目前为止我无法弄清楚它到底是什么。我的第二个猜测是 cookie 和 session 内容没有正确设置。 scotch.io 教程是为较旧版本的 Express 编写的,我必须进行更改才能使所有内容保持最新。

最佳答案

虽然为了您的方便而提供了一种“默认重定向机制”,但没有“默认重定向机制”。

您正在使用自定义回调,因此我怀疑问题是由于根本没有调用 req.login() 引起的。如前所述in the documentation

Note that when using a custom callback, it becomes the application's responsibility to establish a session (by calling req.login()) and send a response.

那么,尝试一下它是否可以像这样工作:

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

关于node.js - 您可以在 RESTFUL 环境中使用 NodeJs Passport Session 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26091183/

相关文章:

wcf - 使用 Azure ACS 和 OAuth 2.0 的 Facebook 式 API 访问场景 : how to implement app authorization?

php - 在 Auth::attempt() Laravel 5.1 中禁用重定向

node.js - npm copyfiles 不正确的目标路径

node.js - 将变量从 jade 传递到 ng-init 不起作用

rest - 当 PUT 是空操作时,HTTP 服务器应该返回 200 吗?

PHP获取div位置并存储在session中

session - 我应该如何在 node.js 上实现 session 存储

node.js - 使用spy-js 分析 gulp 构建

javascript - 带 Promise 的 for 循环在 Node.js 中无法正常工作

ASP.NET session 在负载下损坏