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に保存されます。そのページを更新すると、セッションが継続しているように見えます。新しいページに移動した場合、またはタブを閉じて同じページを再度開いた場合でも、新しいセッションが作成されます。

パスポートはログインページ用に生成されたセッションのみを認証するため、これは特に苛立たしいことです。セッションをページ間で持続させるにはどうすればよいですか?

更新:ブラウザが実際に返送されたCookieを確認するように通知してくれた@robertklepに感謝します(開始するにはこれを行う必要がありました)。ブラウザが正しいCookieを送り返し、認証が機能していることがわかりました。セッションは実際には永続化されていますが、何らかの理由で、ページ要求ごとに新しいセッション(ブラウザーで使用されていない)が作成されます。どうすればこれを止めることができますか?

4

2 に答える 2

4

「ああ、ブラウザがファビコンのリクエストとともにセッションCookieを送信しないことを知らなかったのですか?」私の部屋のハッカーは、その同類が次の1行のコードの必要性を生み出したと言います。

11時間後のデバッグで、問題が解決しました。

app.use express.favicon()

Expressはファビコンを他のリソースと同じように扱っていましたが、ブラウザはファビコンに対して特殊な、明らかに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 に答える