web-dev-qa-db-ja.com

シリアル化および逆シリアル化パスポートメソッドはいつ呼び出されますか?それは正確に何を設定しますか?

ユーザーには、管理者ユーザーと一般ユーザーの2種類があります。

passport.serializeUser(function(user, done) {
  console.log('Sear');
  done(null, user.id);
});

passport.deserializeUser(function(id, done) {
  console.log(id);
  console.log("Deser");
  User.findById(id, function(err, user) {
    if(err) done(err);
    if(user){
      done(null, user);  
    }else{
       vendorUser.findById(id, function(err, user){
        if(err) done(err);
        done(null,user);
       });
    }
  });
});

Console.logは、テキストとともに頻繁に(単一のAPIリクエストでも)出力されます

デザート

両方の機能は正確に何をしますか?詳細な回答をいただければ幸いです。 TIA。

14
bombayquant

シリアル化と逆シリアル化は重要な概念です。 オブジェクトをシリアル化するということは、その状態をバイトストリームに変換して、バイトストリームをオブジェクトのコピーに戻すことができるようにすることを意味します。

通常のWebアプリケーションでは、ユーザーの認証に使用される資格情報は、ログイン要求中にのみ送信されます。認証が成功すると、ユーザーのブラウザーに設定されたCookieを介してセッションが確立および維持されます。

後続の各リクエストには、資格情報ではなく、セッションを識別する一意のCookieが含まれます。 ログインセッションをサポートするために、Passportはセッションとの間でユーザーインスタンスをシリアル化および逆シリアル化します。

作成したコードでは、ユーザーIDのみがセッションにシリアル化されます。以降のリクエストを受信すると、このIDを使用してユーザーが検索され、req.userに復元されます。

開発者が必要なデータベース、シリアル化するデータが何であれ、ユーザーに自由を与えるために、開発者は独自の方法でそれを行うことができます。シリアル化と逆シリアル化のロジックの実装は私たちに任されています。

25
NarendraSoni

serializeUserは、ログイン要求(認証中)で呼び出されるメソッドであり、ログインが成功した場合、セッションに保存するユーザー情報を決定し、Cookieがブラウザーに送信されます。セッションを維持します。

// Only during the authentication to specify what user information should be stored in the session.
passport.serializeUser(function (user, done) {
    console.log("Serializer : ", user)
    done(null, user.id);
});

上記のスニペットは、user.idフィールドをセッションとCookieに保存します。

deserializeUserは、後続のすべての要求で呼び出され、passport.sessionミドルウェアによって呼び出されるメソッドです。これにより、リクエストごとに追加のユーザー情報を読み込むことができます。このユーザーオブジェクトはreq.userとしてリクエストに添付され、リクエスト処理でアクセスできるようになります。

ここにあります それが非常にうまく流れることを説明する記事

8
Sunil Garg