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

标签 node.js express redis passport.js

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

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/

相关文章:

javascript - 统一事件和 Promise 是 JS/Node

javascript - django 模板中的socket.io - node.js 不服务socket.io.js

javascript - 引用错误 : error is not defined

redis - 在 appveyor 上启动 redis-server

ruby-on-rails - Ruby - 异步邮件

node.js - 寻找一种更有效的方法在 mongoose-q 中执行许多查询

javascript - 在 NodeJS 中发出外部 HTTP 请求的单元测试 Controller 功能

mysql - 如何使用 Express.js 和 MySQL 为每首歌曲创建具有唯一 URL 的单独 html 链接?

node.js - 将 ISODate 更改为字符串日期 ExpressJS

java - Python 将字节写入 Redis,但 Java 读取它时出现异常