【问题标题】:expressjs passport mongodb session not found找不到expressjs护照mongodb会话
【发布时间】:2015-06-18 10:33:37
【问题描述】:

我用的是passport.js + express.js + mongodb,我觉得实现服务器认证是一种很血统的方式,但是我发现有些奇怪。

设置会话存储:

  // CookieParser should be above session
  app.use(cookieParser());
  app.use(cookieSession({ secret: 'secret' }));
  app.use(session({
    resave: true,
    saveUninitialized: true,
    secret: pkg.name,
    store: new mongoStore({
      url: config.db    
    })
  }));

  // use passport session
  app.use(passport.initialize());
  app.use(passport.session());

然后,每当我登录时,我都会检查我的 mongodb,但找不到 sessions 集合。

有人知道为什么吗?

谢谢。

【问题讨论】:

  • 如果没有看到您需要mongoStoreconfig.db 的输出,这是不可能回答的。

标签: node.js mongodb session express passport.js


【解决方案1】:

我可能错了,但据我了解,护照 js 创建的用户会话并未存储在数据库中。当会话开始时,它将转到您的数据库并获取用户信息。如果用户信息存在,那么它将会话附加到 req.user。除非您在会话初始化后添加自定义功能以存储会话信息,否则它实际上不会将会话保存到数据库中。也许this article 会帮助您更多地了解正在发生的事情。如果您想保存会话信息,可以创建一个模型,该模型将接受存储在 req.user 中的信息,并在会话开始后保存。

【讨论】:

  • 非常感谢,我在发布这个问题后就知道了,但我想知道当护照加载数据库时,会有成本。我想知道它是否会占用太多资源?
  • pt1 - 我不相信有办法绕过它。除非您将用户信息存储在应用程序中托管的平面文件中(不推荐),否则它将需要访问数据库以验证他们是用户。
  • pt2 - 您可以让您的服务器从数据库中提取所有用户并将它们存储到一个列表中,然后在创建新用户时扫描数据库以将其添加到列表中更新包含用户的列表,它只需要在创建新用户后触摸数据库,而不是在用户登录时。它将根据内存中已有的用户列表进行验证。
  • pt3 - 话虽如此,我认为将所有用户信息都放在应用程序内部并不是一个好主意,出于安全目的,我也建议不要采用这种方法。抱歉,如果这不能回答您的问题,也许您可​​以改写一下以帮助我更好地理解您的要求。
  • 好吧,我的意思是,只要有对服务器的传入请求,护照就会不断查询数据库。试想一下,如果有大量的用户请求 API,并且每个 API 都会调用一次 db 进行会话检查,那将是一个很大的成本,因为大部分时间,数据库都存储在磁盘中。我想知道是否有更好的方法来帮助护照验证用户会话。正如你上面的回答,我认为它不会更好。 MongoDB在很大程度上依赖于内存。我觉得每次做session check可能没那么痛苦?
【解决方案2】:

您正在使用cookie-session 模块和express-sesion 模块。这两个中间件正在互相争斗。这两个模块都实现了会话,您只需要使用这两个模块中的一个。 cookie-session 将会话存储在 cookie 中,在您的情况下,express-session 会将您的会话存储在 Mongo 中。 您选择哪一种取决于您的应用要求。

关于您的问题的详细信息是,由于它在中间件堆栈中的第一个,cookie-session 正在创建一个 req.session 属性。然后express-session 代码看到这个属性已经存在并决定什么都不做。这就是 Mongo 不显示会话的原因。

【讨论】:

    猜你喜欢
    • 2017-09-30
    • 2013-04-10
    • 2019-06-23
    • 1970-01-01
    • 1970-01-01
    • 2014-06-03
    • 2012-07-01
    • 2021-05-19
    • 2014-06-04
    相关资源
    最近更新 更多