セッションを使用している場合 パスポートにシリアル化および逆シリアル化機能を提供する必要があります。セッションストアとしてRedisを実装することは、パスポートがどのように実装されたかとは関係がなく、セッションデータが保存される場所のみを扱います。
パスポートを使用したセッションの実装
私が言ったように、セッションが機能するためには、パスポートにシリアル化および逆シリアル化機能を提供する必要があります。
シリアル化の目的 機能は、後続のリクエストでユーザーアカウントを回復するのに十分な識別情報を返すことです。具体的には、done()
の2番目のパラメーターです。 メソッドは、セッションデータにシリアル化された情報です 。
逆シリアル化 指定する関数は、セッションにシリアル化された識別情報に基づいてユーザープロファイルを返すことを目的としています。 。
これは、セッションについて説明しているセクションのパスポートガイドの例です。
passport.serializeUser(function(user, done) {
done(null, user.id);
});
passport.deserializeUser(function(id, done) {
User.findById(id, function(err, user) {
done(err, user);
});
});
上記の例では、passport.serializeUser()
ユーザープロファイル(user
)の2つのパラメーターを受け取る関数が提供されます )およびコールバック関数(done
)。コールバック関数は、2番目のパラメーターとして識別情報(user.id
)を取ります。 、ただし、mongoDBを使用している場合、これはuser._id
である可能性があります )データベースからアカウントを回復するために必要です。これは、認証されたすべてのリクエストで呼び出され、識別情報をセッションデータに保存します(CookieまたはRedisストアのどちらにあるかは関係ありません)。
passport.deserializeUser()
識別情報(id
)の2つのパラメーターも受け取る関数が提供されます )そして再びコールバック関数(done
)。識別情報は、前のリクエスト(user.id
)でセッションデータにシリアル化されたものです。 )。ここでのコールバック関数は、2番目のパラメーターとしてユーザープロファイルを必要とするか、最初のパラメーターとしてプロファイルを取得する際に発生したエラーを必要とします。 User.findById()
functionは、データベース内のユーザープロファイルのルックアップ関数です。この例では、User
オブジェクトは、findById()
を持つマングースモデルのインスタンスです。 機能。
passport.deserializeUser()
に提供される関数 パスポートミドルウェアpassport.session()
によって呼び出されます ユーザープロファイルを保存するためのルート処理の前(user
)からreq.user
。
Redisをセッションストアとして実装する
Redisを使用する目的は、セッションデータサーバー側を保存することです。そのため、クライアント側に保存されるデータはセッションIDのみです。繰り返しますが、これはパスポートの実装方法とは無関係です。パスポートは、アプリにセッションサポートを追加している限り、セッションデータがどこに保存されているかを気にしません。 stackoverflowに関するこの前の質問では、Redisの実装方法について説明しています