私の開発では、パスポートでnode/expressを使用しています。次のような記事に出会いました:
Expressはセッションデータをロードし、それを要求に添付します。パスポートはシリアル化されたユーザーをセッションに保存するため、シリアル化されたユーザーオブジェクトはreq.session.passport.userにあります。
しかし、驚いたことに、ブラウザCookieのsessionIDストアの値は、ログイン前後で同じままです。では、シリアル化されたユーザーオブジェクトはどこに保存されますか?
最初はユーザーsessionid
Cookieに保存されていると思いましたが、req.session.passport.user
でユーザーオブジェクトにアクセスできるため、そうではないようです。
では、シリアル化されたユーザーオブジェクトはどこに保存されますか?
略して
シリアル化されたユーザーオブジェクトは、req.user
PassportJS
メソッドの助けを借りて、req.session.passport.user
(Express
によって作成されます)から取得したdeserializeUser
によってPassport's
に格納されます。
Express
は、セッションオブジェクトのIDをユーザーのブラウザーのCookieに追加します。これは、リクエストごとにヘッダーで表現するために送り返されます。 Express
はヘッダーからIDを取得し、セッションストア(つまり、Mongoなど)を検索し、エントリを見つけてreq.session
にロードします。
PassportJS
はreq.session
の内容を使用して、serializeUser
およびdeserializeUser
メソッドの助けを借りて認証済みユーザーを追跡します(serializeUser
およびdeserializeUser
のワークフローの詳細については、このSO 質問 )。
Express
は、セッションの作成を担当します。 セッションはいつ作成されますか?それは、Express
がセッションCookieを検出しないときです。したがって、session
またはserver.js
ファイルでpassport
およびapp
構成を編成する順序は非常に重要です。 static directory configs
の上にsession
とpassport
の設定を宣言すると、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つ驚くべき チュートリアル を読むことを強くお勧めします。
セッションデータが保存されているデータベースのキーとして、CookieのsessionID
を見ることができます。 Expressで使用するセッションハンドラと、データを使用するストレージポリシーに応じて、さまざまな方法で保存されます。これは、ログイン前、ログイン成功後、およびユーザーがログアウトした後でも、sessionIDが同じ値になる可能性があることを意味します。
express-session をMemoryStore
とともに使用すると、データは、sessionIDでインデックス付けされたノードプロセスのメモリに保存されます。ストアの 初期化 を探し、データの 保存 を探します。
データがCookieにシリアル化されるストアを作成できますが、 互換性のあるセッションストア にはリストされません。