web-dev-qa-db-ja.com

パスポートjsはセッションでユーザーオブジェクトをどのように保存しますか?

私の開発では、パスポートでnode/expressを使用しています。次のような記事に出会いました:

Expressはセッションデータをロードし、それを要求に添付します。パスポートはシリアル化されたユーザーをセッションに保存するため、シリアル化されたユーザーオブジェクトはreq.session.passport.userにあります。

しかし、驚いたことに、ブラウザCookieのsessionIDストアの値は、ログイン前後で同じままです。では、シリアル化されたユーザーオブジェクトはどこに保存されますか?

最初はユーザーsessionid Cookieに保存されていると思いましたが、req.session.passport.userでユーザーオブジェクトにアクセスできるため、そうではないようです。

19
desmondlee

では、シリアル化されたユーザーオブジェクトはどこに保存されますか?

略して

シリアル化されたユーザーオブジェクトは、req.userPassportJSメソッドの助けを借りて、req.session.passport.userExpressによって作成されます)から取得したdeserializeUserによってPassport'sに格納されます。

Expressは、セッションオブジェクトのIDをユーザーのブラウザーのCookieに追加します。これは、リクエストごとにヘッダーで表現するために送り返されます。 ExpressはヘッダーからIDを取得し、セッションストア(つまり、Mongoなど)を検索し、エントリを見つけてreq.sessionにロードします。

PassportJSreq.sessionの内容を使用して、serializeUserおよびdeserializeUserメソッドの助けを借りて認証済みユーザーを追跡します(serializeUserおよびdeserializeUserのワークフローの詳細については、このSO 質問 )。

Expressは、セッションの作成を担当します。 セッションはいつ作成されますか?それは、ExpressがセッションCookieを検出しないときです。したがって、sessionまたはserver.jsファイルでpassportおよびapp構成を編成する順序は非常に重要です。 static directory configsの上にsessionpassportの設定を宣言すると、static contentに対するすべてのリクエストもセッションを取得しますが、これは良くありません。

これに対する私の答えを参照してくださいSO question 、静的コンテンツへのアクセスと、デフォルトではなく特定のルートにpassportを選択的に適用する方法について言及しました。すべてのルートを認証する必要はありません-したがって、安全なURLにマップするリクエストにのみセッションをアタッチすることで、不要なsession store lookupおよびde-serializationを回避できます。

//selectively applying passport to only secure urls
app.use(function(req, res, next){
  if(req.url.match('/xxxx/secure'))
    passport.session()(req, res, next)
  else
    next(); // do not invoke passport
});

PassportJSのワークフローを理解したい場合は、1つ驚くべき チュートリアル を読むことを強くお勧めします。

33
Raf

セッションデータが保存されているデータベースのキーとして、CookieのsessionIDを見ることができます。 Expressで使用するセッションハンドラと、データを使用するストレージポリシーに応じて、さまざまな方法で保存されます。これは、ログイン前、ログイン成功後、およびユーザーがログアウトした後でも、sessionIDが同じ値になる可能性があることを意味します。

express-sessionMemoryStoreとともに使用すると、データは、sessionIDでインデックス付けされたノードプロセスのメモリに保存されます。ストアの 初期化 を探し、データの 保存 を探します。

データがCookieにシリアル化されるストアを作成できますが、 互換性のあるセッションストア にはリストされません。

2
bolav