2016-06-01 3 views
1

idフィールドは、modeldoc、またはrecordのいずれかにしてください。では、どうしてdone(null, user.id)が働くのですか?私は_idですが、idはありません。パスポートオブジェクトがデータベース内のユーザの_idとセッションに追加されているようですが、自動的に行われるのはどのようにして_idになりましたか?ドキュメントには、それはこの例ではpassport.jsのしくみに関する質問。特にuser.idについて

を言う、唯一のユーザーIDは、どのようにそれがIDを取得したセッション

にシリアライズされ、どのようにユーザーを取得したのですか?私のコードで

同様の例:

passport.serializeUser(function(user, done){ 
    done(null, user.id) 
}); 

passport.deserializeUser(function(id, done){ 
    User.findById(id, function(err, user){ 
     done(err, user); 
    }) 
}); 

それがユーザーIDを取得するのにかかるの手順は何ですか?

私も

passport.use("login", new LocalStrategy(function(username, password, done){ 
     User.findOne({username : username}, function(err, user){ 
      if(err){return done(err)} 
      if(!user){ 
       return done(null, false, {message : "no User has that name"}) 
      } 
     ....... 

を持っているが、私は何とかパスポートの方法にDBにユーザーを接続passport.use()を使用しているという事実を行います。

編集私はuser.nameを使用する必要がありますが、名前フィールドにパスポート経由でdoc(ユーザー)を転送したいとしますか?

はまた、私は、どのようにdone(null, user.id)作品を来た作品

答えて

3

をシリアル化する方法については本当にわかりません。私は_idですが、idはありません。

あなたは_idプロパティを返します文書に、いわゆるvirtual getter called idを追加マングースを、使用しています。あなたのケースでは、user.iduser._idの両方が動作します(同じ結果を返します)。

私がpassport.use()を使用しているという事実は、DBのユーザーをパスポート方式に何らかの形で接続していますか?

はい、いいえ。 passport.use()に渡す戦略は、認証プロセスを実装します。 には、入力したユーザー情報がデータベースに対してどのように検証されるかを実装する必要があります。このコード例では、User.findOne()への呼び出しが行われ、その呼び出しの結果が提供された情報と照合されます("有効なユーザー名はusernameですか?passwordはこのユーザーのパスワードですか?")。

ユーザ名とパスワードが一致する場合、ユーザ文書を引数としてdoneコールバックが呼び出されます。この文書はPassportがさまざまな部分に渡すものです。例えば、passport.serializeUser()(下記参照)になります。

また、シリアル化の仕組みについてはわかりません。

「セッションオブジェクト」にユーザーに関する情報を格納するためにシリアライズが使用されます。このオブジェクトは、ユーザーを一意に識別できる必要があります。 user.id(またはuser._id)はユーザーに固有のものなので、使用するのに適しています。

ここにはpassport.serializeUser()が入ります。ユーザー文書が渡され、そのユーザーに関する一意の識別情報をPassport(コールバック関数を呼び出して)に提供する必要があります。従ってdone(null, user.id)

セッションオブジェクト自体も "セッションキー"によって一意に識別されます。このキーは、ユーザーが正常にログインしたときにHTTP Cookieに保存され、ブラウザに送信されます。ブラウザがあなたのウェブサイト上の別のページを開くと、ブラウザはそのクッキーを送信し、クッキー内のセッションキーを使用して、セッションオブジェクトを「セッションストア」から取得します。

セッションオブジェクトには一意のユーザーIDが含まれていますが、残りのユーザー情報は含まれていません。つまり、passport.deserializeUser()が入ります。idを渡し、データベース参照を実行してそのIDに属するすべてのユーザー文書を取得します。これはパスポートがルートハンドラにreq.userとして利用できるようにするものです。

これらの手順がすべて正常に実行された場合(Cookieの有効期限が切れるため、ユーザーが削除されるなど)、Passportがユーザーを確実に識別できたことを意味します。もう一度ログインする必要はありませんセッションが終了するまで少なくとも。

+0

だから 'done(null、user.id)'は 'passport.serializeUser()'のコールバックの中にあります。どの時点で、あるいは 'user.id'が私たちが認証しているユーザのIDを取得したのか疑問に思っています。 –

+0

ああ、これは 'passport.use'メソッドと戦略が活躍する場所だと思います。 'passport.use'の中の' done'メソッドがユーザ文書とともに返されます。これが 'serializeUser()'に適切な 'user.id'を得る方法です。私は混乱していると私はどのようにユーザーのドキュメントがpassport.use()からソースコード内のpasspor.serializeUserに転送されるのを見たいと思います。あなたがチャンスを取ったときに、私にその部分を見せてくれるかもしれません。 –

+0

'passport.use()'とシリアライズメソッドがソースコード内でどのように接続されているのかを見てみたいと思います。ありがとう –

関連する問題