パスポートのシリアル化とデシリアル化の理解 質問する

パスポートのシリアル化とデシリアル化の理解 質問する

Passport のシリアル化およびデシリアル化メソッドのワークフローを一般の人にどのように説明しますか。

  1. 呼び出されたuser.id後はどこへ行くのでしょうか?passport.serializeUser

  2. すぐに呼び出します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

  1. 呼び出されたuser.id後はどこへ行くのでしょうか?passport.serializeUser

ユーザー ID (関数の 2 番目の引数として指定done) はセッションに保存され、後で関数を介してオブジェクト全体を取得するために使用されますdeserializeUser

serializeUserセッションに保存するユーザーオブジェクトのデータを決定します。serializeUser メソッドの結果は、セッションに として添付されますreq.session.passport.user = {}。ここでは、たとえば次のようになります (ユーザー ID をキーとして指定するため)req.session.passport.user = {id: 'xyz'}

  1. すぐに呼び出します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   
});

おすすめ記事