2016-07-19 9 views
0

私は、ユーザーにウェブサイトを提供するウェブサーバーを持っています。このWebサイトを通じて、oauthを使用してサインインできます。oauthは、現在サーバー上のセッションに保存しています。セッションは基本的にちょうど私がこのユーザーであるか、ユーザーがサインインしているかどうかを教えてくれる。認証:セッション、JWTなど何か?

次に、保護されている可能性のある情報(つまり、ログインしたユーザーのみが見ることができる情報)を照会するために使用されるAPIサーバーがあります。 APIサーバーはメインサーバーからのみアクセスできます。メインサーバーはすべての機能をプロキシします。 APIサーバーは同じバッキングストアにアクセスできます。つまり、セッションを読み取り、認証チェックが必要なリクエストを処理できます。このアプローチには、セッションが保存されるまでメモリにしか保存されないため、APIサーバーに新しいデータがあることを確認するために、要求がサーバーにプロキシされるたびに保存する必要があります。

実際の問題ではなく、ユーザーが/accountと発言したときに、必要なすべてのデータをプリフェッチし、サーバー上でサイト全体を構築して送信したい(つまり、 http-requestを待ち、サイト全体を再びレンダリングする)。これは、サーバーが認証されたユーザーだけが見ることができる領域にアクセスしようとすると拒否されるため、問題があります。この問題を回避するには、リクエストにセッションIDを注入し、間違ったアプローチのように直感的に感じる多くのコードを再作成する必要があります。私がJWTを使用すると、サーバが生成する "スーパーユーザトークン"を作成して、認証された領域のどの部分にもアクセスできるようにすることもできますが、それも危険を感じます。

あなたはどう思いますか?

関連するかもしれないいくつかの追加情報:

  • は私が(私は事前入力しようとする状態である)Reduxの
  • を使用しています反応し使用して
  • をレンダリングするサーバ側をやっている私はノードを使用して

ありがとうございます!

答えて

0

このミドルウェアの安全ルート/エンドポイント にコントローラの前にミドルウェアを使用して、トークンが有効であれば次のミドルウェアを呼び出してください。

router.route('/post') 
.post(isAdmin,postCntr.addPost); 



    function isAdmin (req, res, next) { 
    var token = req.headers['authentication'] || req.body.token || req.params.token; 
    if (token) { 
     // verifies secret and checks exp 
     jwt.verify(token, app.get('superSecret'), function(err, decoded) { 
      if (err) { 
       return res.json({ 
        err: err, 
        success: false, 
        message: 'Failed to authenticate token.' 
       }); 
      } else { 

       next(); 
      } 
     }); 

    } else { 

     // if there is no token 
     // return an error 
     return res.status(403).send({ 
      success: false, 
      message: 'No token provided.' 
     }); 
    } 
}