web-dev-qa-db-ja.com

パスポートを理解する

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);
        });
    });
    

私はまだ頭を包み込もうとしています。私は完全に機能するアプリを持っていて、いかなる種類のエラーにも遭遇していません。

私はちょうどここで何が起こっているのか正確に理解したかったのですか?

任意の助けは大歓迎です。

276
Anubhav
  1. user.idが呼び出された後、passport.serializeUserはどこに行くのですか?

ユーザーID(done関数の2番目の引数として指定したもの)はセッションに保存され、後で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   
});
361
A.B

Koaと koa-passport を使っている人のために:

SerializeUserメソッドで設定されたユーザーのキー(多くの場合そのユーザーの一意のID)は、次の場所に格納されます。

this.session.passport.user

DeserializeUserのdone(null, user)に 'user'がデータベースのユーザーオブジェクトであると設定した場合:

this.req.user OR this.passport.user

何らかの理由でthis.user deserializeUserメソッドでdone(null、user)を呼び出したときにKoaコンテキストが設定されることはありません。

そのため、app.use(passport.session())を呼び出した後に、独自のミドルウェアを作成してthis.userに含めることができます。

app.use(function * setUserInContext (next) {
  this.user = this.req.user
  yield next
})

SerializeUserとdeserializeUserがどのように機能するのかがわからない場合は、Twitterで確認してください。 @ yvanscher

18
yvanscher