我是否实现了序列化和反序列化?
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/