2016-08-14 7 views
0

私はnodejsアプリケーション(http://app.winetracker.co)を持っており、OAuthログインを統合しています。 global.redirectURL varを使用して、OAuthコールバック後に使用するリダイレクトURLを一時的に保存できると思います。NodeJSのGlobal.varを使用して、OAuthコールバック後に使用するリダイレクトURLを一時的に保存します。

// url param passed to route /auth/twitter?redirectUrl=/path/to/location 

app.get('/auth/twitter', function(req, res) { 
    var redirectUrl = req.param('redirectUrl'); 
    global.redirectUrl = req.param('redirectUrl'); 
    passport.authenticate('twitter', {})(req, res); 
}); 
app.route('/auth/twitter/callback').get(users.oauthCallback('twitter')); 

私は2人のユーザーが同じ時刻にはOAuth経由で私のアプリにログインしている場合は、global.redirectURL値は、各ユーザーのリダイレクトVAR値によって上書きされますか?

本質的に、各ユーザーに固有のグローバル値ですか、誰もは同じglobal.redirectUrl var値を共有していますか?

答えて

1

私は2人のユーザーが同じ時刻にOAuthを介して、私のアプリにログインしている場合、global.redirectURL値は、各ユーザーのリダイレクト のvar値によって上書きされます でしょうか?

はい、上書きされ、このようにするのは重大な問題です。

本質的には、各ユーザーに固有のグローバル値か、すべてのユーザーが同じglobal.redirectUrl var値を共有していますか?

グローバル値はサーバー全体で共有されるため、処理中の可能性のあるすべてのユーザーによるすべての要求によってすべてが表示されます。このような一時的な情報をグローバルに保存することはほとんどありません。認証コードが非同期(私が想定している)の場合は、複数の要求を簡単にグローバル化することができます。これは、バグに襲われたことです。問題を解決する別の方法に変更する必要があります。世界の脆弱性は以下のものが含まれていないこの種の問題に

通常のソリューション:

  1. セッションマネージャを使用し、それができるように、この特定のブラウザのセッションにデータを置きますリダイレクト中にそこから検索されます。

  2. リダイレクトURLにクエリーパラメータとして情報を入力すると、リダイレクトURLがブラウザに戻ったときにクエリー文字列から解析することができます。

  3. コインこのリクエストの一意のIDをクッキーとして設定し、そのIDをキーとして一時的なデータをマップに格納します。その後、リダイレクトが戻ったときに、Cookieを使用してIDを取得し、マップ内の値をルックアップすることができます。これは本質的にセッションですが、この目的のためだけの特別な目的です。徹底させるためには、あなたのマップが漏れていないことを確認して、時間の経過とともに増強する必要があります。タイムスタンプを保存し、古い値を削除して定期的に地図をクリーンアップする必要があります。

+0

ありがとうございます!それは私のために物事を完全にクリアする。乾杯。 :) – tonejac

+0

それはreq.sessionにそれを格納するのと同じくらい簡単ですか? req.session.redirectUrl – tonejac

+1

@tonejac - すでにセッションが確立されている場合は、セッションが新しい情報を保存するために使用するメカニズムがすべて必要です。まだ認証されていない初めてのユーザーのために、パスポート使用が確立されていることを確認できませんでした。 – jfriend00

関連する問題