2017-05-01 4 views
1

私が理解している考え方は、認証されていなくてもPassportがすべてのユーザーに対して一意のセッションIDを生成するということです。それらが認証されると、サーバーはuserId(通常はデータベースから)をこのセッションIDに関連付けることができます。Passport認証の一意のセッションIDの概念

私はコードを見ていることだし、それは、セッション内のuserId passport.serialize店のように見え、その後passport.deserializeがセッションに保存されているユーザーIDを取り、より多くのユーザー情報をデータベースに照会し

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

passport.deserializeUser(function(id, done) { 
    User.findById(id) 
     .then(user => done(null, user)) 
     .catch(err => done(err)); 
}); 

私が実際に見ないのは、ユニークなsessionIdです。 userIdがセッションに格納されている場合、誰もuserIdを偽装してユーザ情報を取得できないでしょうか?または、PassportによってsessionIdとuserIdのマッピングが実行されていますか?

答えて

1

はい、通常の条件下では、パスポートは、一意のセッションキーを作成し、アプリの起動時にそれを設定するときに提供秘密でそれを暗号化します。そのキーの暗号化された形式は、クッキーヘッダーとしてクライアントに送信されます。これは、クライアントがクラックするために計算コストがかかります。

クライアントが次回の要求でそのCookieを送り返すと、Passportは同じ秘密情報を使用して保存されたセッションキーをCookieから抽出し、その値をdeserializeUserコールバックに渡して関連情報を取得します。持ってる。

一部の詳細は、戦略によって異なります(例:JWT戦略ではCookieが使用されず、ヘッダーとして送信されるJWTトークン自体が使用されます)が、一般的なパターンは同じです。