2016-08-30 9 views
1

私は多くのルートを持っています。 ほとんどは認証が必要です。 そうではありません。ここで認証ミドルウェアでルートを整える

彼らは以下のとおりです。

router.get('/secure1', function (req,res) {...}) 
router.get('/secure2', function (req,res) {...}) 
router.get('/secure3', function (req,res) {...}) 
router.get('/:id', function (req,res) {...}) 

1.だが、私は公共のルートを持っていなかった想像してみましょう。

私はちょうどセキュリティチェックミドルウェアを置くことができ、すべてがうまくいきます。 セキュリティで保護された接続のみを許可し、セキュリティで保護されていないリダイレクトを行います。

router.use(function (req,res,next) { 
    securityCheck() 
    next() 
}) 
router.get('/secure1', function (req,res) {...}) 
router.get('/secure2', function (req,res) {...}) 
router.get('/secure3', function (req,res) {...}) 
router.get('/:id', function (req,res) {...}) 

これは機能します。これはすべての安全なルートを安全にしますが、私は公共のルート( '/:id')から私をブロックします。

router.get('/:id', function (req,res) {...}) 
router.use(function (req,res,next) { 
    securityCheck() 
    next() 
}) 
router.get('/secure1', function (req,res) {...}) 
router.get('/secure2', function (req,res) {...}) 
router.get('/secure3', function (req,res) {...}) 

をしかし、この方法は、それは私のすべての要求をキャッチし、すべてのセキュアパスはアクセスできません:

2.私が先頭に公共のルートを移動することができます。

3.私はすべての単一の安全なルート上のミドルウェアを置くことができるが、それは少し退屈と人間のエラーが発生しやすいようです:

router.get('/secure1',securityCheck(), function (req,res) {...}) 

だから、私はdidnの良いオプションがあります考えない?ベストプラクティスとは何でしょうか?

ありがとうございました

答えて

2

オプションのうち、私は個人的に最初のものを好むでしょう。ミドルウェアでは、常にreq.pathまたはreq.urlをチェックして、セキュリティで設定するものを選択することができます。

別のオプションは、.htaccessのようなHTTP認証を使用しています。 https://github.com/http-auth/http-authをご覧ください。

私が前に認証を行った方法は、リクエストボディにjsonとして一度ユーザー名/パスワードを渡してから、将来のリクエスト(https://github.com/auth0/node-jsonwebtoken)用のステートレストークンを生成することでした。私の場合、多くのルータエントリは認証が必要ではないので、エントリ自体で処理しました。

また、セキュリティを強化するために、HTTPSを使用するか、データをエンコードします。例えば。 How to create an HTTPS server in Node.js?

希望しました!あなたがのObjectIdのを一致させたい場合は

router.get('/:id([a-fA-F0-9]{24})', function (req,res) {...}) 

/:idが特定のパターンと一致している必要があり

+0

ありがとうございます!私は同意する、私は最初の方法は維持するのが最も簡単で、人間の間違いは、それが反対であるより安全であるかのように公開されているものを作る傾向があるように感じる。 それで、誰かが最後のルートをリクエストしている場合、ミドルウェアに続行するように指示するにはどうすればよいですか? –

+0

もし私があなただったら、非セキュアなものと区別することになります(つまり、/ public /:idのようなもの)。それは安全なものと混同されないからです。 idパラメータを文字列secure3として設定します)。ミドルウェアの初めに次のようなことができます:if(req.pathがpublicで始まる){next()} else {...} –

+0

意味がありますか? :) –

1

場合は、MongoDBのObjectIdは、あなたはそれが他のルートとは一致しませんので、試合はより具体的にすることができると言います何も、あなたがこれを使用することはできません。

router.get('/:id(|[a-fA-F0-9]{24})', ...); 

詳しい情報herepath-to-regexpは、ExpressはURLのマッチングを行うために使用するモジュールです)。

+0

うわーそれは素晴らしいです!私はあなたがそれを行うことができたのか分からなかった!どのようにしてこの正規表現を修正して、MongoDB ObjectIdを受け付けるか、何も受け付けないのですか? 意味 '/ ObjectID'と '/'は両方ともそこにつながります。 '/ EverythingElse'は他の場所につながるでしょうか? –

+0

@MichaelSeltenreich編集参照) – robertklep

+0

ありがとう!私はあなたの答えをupvoted、私はそれが完全に質問に答えていないので、正しい答えとしてそれを選択することはできません。これで、これはこのページで最も役立つものです。ありがとうございました! –

関連する問題