1

我正在尝试像这样实施快递和护照会议:

  app.use(connect.bodyParser());
  app.use(express.cookieParser());
  app.use(express.session({
    cookie: {
      path: "/",
      httpOnly: true,
      maxAge: null
    },
    store: redisStoreConnect,
    secret: "something",
    key: 'pksy.sid'
  }));
  app.use(passport.initialize());
  app.use(passport.session());

  passport.serializeUser (user, done) ->
    done null, user.email
    return

  passport.deserializeUser (email, done) ->
    User.findOne
        email: email
      , (err, user) ->
        done err, user
        return 
    return

如果我导航到站点中的页面,则会创建一个新会话并将其存储在 redis 中。如果我刷新该页面,会话似乎会持续存在。如果我导航到新页面,或者即使我关闭选项卡并重新打开到同一页面,也会创建一个新会话。

这尤其令人沮丧,因为护照只验证为我的登录页面生成的会话。如何让我的会话跨页面持续存在?

更新:感谢@robertklep 提醒我检查浏览器实际发回的 cookie(我应该这样做才能开始)。事实证明,浏览器正在发回正确的 cookie,并且身份验证正在工作。会话实际上是持续存在的,但由于某种原因,每个页面请求都会创建一个新会话(浏览器未使用)。我怎样才能阻止这个?

4

2 回答 2

4

“哦,你不知道浏览器不会发送会话 cookie 和对 favicon 的请求吗?” 我的室友黑客说,他的同类创造了对以下单行代码的需求。

11 小时后的调试解决了这个问题:

app.use express.favicon()

Express 将 favicon 视为任何其他资源,而浏览器则对其进行专门的、显然没有 cookie 的请求。Express 假设这个请求一定来自没有会话 cookie 的客户端,因此它为他们创建了一个新会话;一个永远不会被再次召集的会议。express.favicon()节省一天!

于 2013-02-26T04:37:14.853 回答
0

就我而言,我必须使用

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

app.use(app.router);

希望这能有所帮助。

于 2013-05-23T10:31:53.713 回答