gpt4 book ai didi

node.js - 我是否实现了 NodesJS + Passport + RedisStore 的序列化和反序列化?

转载 作者:IT老高 更新时间:2023-10-28 22:11:06 27 4
gpt4 key购买 nike

我是否实现了序列化和反序列化?

RedisStore 设置为我与 Express 的 session 存储。这是否意味着我没有实现序列化和反序列化?它会自动发生吗?

当我不实现这些方法时,我会收到以下 Express 错误 - 500 错误:无法将用户序列化到 session 中。当我实现它们时,我不确定在反序列化中放入什么。

下面的代码似乎可以工作,但 session 没有持续。每次访问该网站时,我都需要登录。

有没有 NodeJS + Passport + RedisStore 的好例子?

var sessionStore = new RedisStore({
host: rtg.hostname,
port: rtg.port,
db: redisAuth[0],
pass: redisAuth[1]
});

passport.use(new ForceDotComStrategy({
clientID: clientId,
clientSecret: clientSecret,
callbackURL: myurl
},
function(token, tokenSecret, profile, done) {
console.log(profile);
return done(null, profile);
}
));

appSecure.configure('production', function(){
appSecure.use(allowCrossDomain);
appSecure.use(express.cookieParser(expressSecret));
appSecure.use(express.bodyParser());
appSecure.use(express.methodOverride());
appSecure.set('port', port);
appSecure.use(express.session({ secret: expressSecret, store: sessionStore, key:'expressSid', cookie: { maxAge : 604800, domain:'.domain.com'}}));
appSecure.use(passport.initialize());
appSecure.use(passport.session());
appSecure.use(appSecure.router);
appSecure.use(express.static(__dirname + '/public'));
appSecure.use(express.errorHandler());
});

passport.serializeUser(function( user, done ) {
done( null, user.id);
});

passport.deserializeUser(function( user, done ) {
done( null, user );
});

最佳答案

如果您使用 sessions,您必须为 Passport 提供序列化和反序列化功能。将 Redis 实现为 session 存储与 Passport 的实现方式无关,它只处理 session 数据的存储位置。

使用 Passport 实现 session

正如我所说,必须向 Passport 提供序列化和反序列化功能才能使 session 正常工作。

serialize 函数的目的是返回足够的识别信息,以便在任何后续请求中恢复用户帐户。具体done()方法的第二个参数是序列化到 session 数据中的信息

您提供的反序列化函数旨在根据序列化到 session 的识别信息返回用户配置文件

这是来自 Passport Guide 的示例在讨论 session 的部分:

passport.serializeUser(function(user, done) {
done(null, user.id);
});

passport.deserializeUser(function(id, done) {
User.findById(id, function(err, user) {
done(err, user);
});
});

在上面的示例中,passport.serializeUser() 提供了一个函数,该函数接受两个参数,用户配置文件 (user) 和回调函数 (done )。回调函数的第二个参数是恢复帐户所需的识别信息(user.id,但如果您使用的是 mongoDB,则可能是 user._id)数据库。这将在每个经过身份验证的请求上调用,并将识别信息存储在 session 数据中(无论是在 cookie 中还是在您的 Redis 存储中)。

passport.deserializeUser() 提供了一个函数,该函数也接受两个参数,识别信息 (id) 和回调函数 (done)。标识信息是在上一个请求中序列化为 session 数据的内容 (user.id)。这里的回调函数需要用户配置文件作为它的第二个参数,或者在检索配置文件作为它的第一个参数时引发的任何错误。 User.findById() 函数是数据库中用户配置文件的查找函数。在这个例子中,User 对象是一个 Mongoose 模型的实例,它具有 findById()功能。

提供给 passport.deserializeUser() 的函数由 Passport 中间件 passport.session() 在路由处理之前调用以存储用户配置文件(user) 到 req.user.

将 Redis 实现为 session 存储

使用 Redis 的目的是在服务器端存储 session 数据,因此客户端存储的唯一数据是 session ID。同样,这与您实现 Passport 的方式无关,只要您为应用程序添加了 session 支持, Passport 就不会关心 session 数据的存储位置。 This previos question on stackoverflow解决如何实现 Redis

关于node.js - 我是否实现了 NodesJS + Passport + RedisStore 的序列化和反序列化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19268812/

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