Passport のシリアル化およびデシリアル化メソッドのワークフローを一般の人にどのように説明しますか。
呼び出された
user.id
後はどこへ行くのでしょうか?passport.serializeUser
すぐに呼び出します
passport.deserializeUser
が、これはワークフローのどこに当てはまるのでしょうか?// used to serialize the user for the session passport.serializeUser(function(user, done) { done(null, user.id); // where is this user.id going? Are we supposed to access this anywhere? }); // used to deserialize the user passport.deserializeUser(function(id, done) { User.findById(id, function(err, user) { done(err, user); }); });
まだ理解できていません。アプリは完全に機能しており、エラーは一切発生していません。
ここで一体何が起こっているのか理解したかっただけです。
どのような助けでも大歓迎です。
ベストアンサー1
- 呼び出された
user.id
後はどこへ行くのでしょうか?passport.serializeUser
ユーザー ID (関数の 2 番目の引数として指定done
) はセッションに保存され、後で関数を介してオブジェクト全体を取得するために使用されますdeserializeUser
。
serializeUser
セッションに保存するユーザーオブジェクトのデータを決定します。serializeUser メソッドの結果は、セッションに として添付されますreq.session.passport.user = {}
。ここでは、たとえば次のようになります (ユーザー ID をキーとして指定するため)req.session.passport.user = {id: 'xyz'}
- すぐに呼び出します
passport.deserializeUser
が、これはワークフローのどこに当てはまるのでしょうか?
最初の引数は、関数deserializeUser
に渡されたユーザー オブジェクトのキーに対応しますdone
(1 を参照)。したがって、オブジェクト全体がそのキーを使用して取得されます。ここでのキーはユーザー ID です (キーは、ユーザー オブジェクトの任意のキー、つまり名前、電子メールなどになります)。deserializeUser
そのキーは、メモリ内の配列/データベースまたは任意のデータ リソースと一致します。
取得されたオブジェクトはリクエストオブジェクトに次のように添付されます。req.user
ビジュアルフロー
passport.serializeUser(function(user, done) {
done(null, user.id);
}); │
│
│
└─────────────────┬──→ saved to session
│ req.session.passport.user = {id: '..'}
│
↓
passport.deserializeUser(function(id, done) {
┌───────────────┘
│
↓
User.findById(id, function(err, user) {
done(err, user);
}); └──────────────→ user object attaches to the request as req.user
});