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);
});
});
私はまだ頭を包み込もうとしています。私は完全に機能するアプリを持っていて、いかなる種類のエラーにも遭遇していません。
私はちょうどここで何が起こっているのか正確に理解したかったのですか?
任意の助けは大歓迎です。
user.id
が呼び出された後、passport.serializeUser
はどこに行くのですか?
ユーザーID(done
関数の2番目の引数として指定したもの)はセッションに保存され、後で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
});
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