gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 23:39:47 26 4
gpt4 key购买 nike

我正在尝试在 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com