2017-10-19 23 views
2

Node.js APIにMongoDBデータベースからAngular 4フロントエンドにデータを送信するいくつかのルートがあります。Node.jsのAPIルートを保護する

例:

Node.jsのルート:

router.get('/api/articles', (req, res) => { 
    Article.find({}, (err, articles) => { 
     if(err) return res.status(500).send("Something went wrong"); 
     res.status(200).send(articles); 
    }); 
}); 

角4サービス機能:

getArticles() { 
    return this.http.get('http://localhost:3000/api/articles') 
    .map(res => res.json()).subscribe(res => this.articles = res); 
} 

の質問はどのように私は私のNode.jsを守るか、ありますブラウザアクセスからのAPIルート?私がhttp://localhost:3000/api/articlesに行くと、私はすべての記事をjson形式で見ることができます。

+1

あなたは本当にすることはできません。使用する角度のAPIを公開する場合は、どのWebエージェントもそのAPIを呼び出すことができます。サイトでは、APIが応答する前にサーバーが確認できるログインしたアカウントを要求することはできますが、できることについてはこれで終わりです。あなたの角度コードの外からアクセスすることをより困難にするために置くことができますが、決定されたハッカーと安全なものは何もありません。 – jfriend00

+0

@ jfriend00ありがとうございます、あなたのコメントは高く評価されています。私の目標は、公開APIルートがブラウザ経由で直接アクセスされるのを防ぐことでした。私はユーザー認証が必要なトークンを使用します。 – mikebrsv

答えて

3

アングルアプリがあなたによって制御されている場合、X-Requested-With:XMLHttpRequestのような特殊なヘッダーを送信します(クロムはデフォルトでAJAX呼び出しのために送信します)。このヘッダーの存在を確認する前に応答してください。

特殊なケースにエンドポイントを公開することが特に重要な場合は、一意のヘッダーをX-Request-App: MyNgAppに設定してフィルタリングしてください。

+2

これは、ブラウザでのURLのタイプ入力を防ぐためのきれいな方法です。ハッカーがAPIを使用するのを防ぐために何もしません(基本的にはできません)。 – jfriend00

+0

確かにセキュリティ手段ではありません。これは単なるフィルタです。 – nilobarp

+0

私はこのソリューションをパブリックコンテンツに使用することに決めました。ユーザー認証が必要な場合は、セキュリティ対策としてトークンを使用します。 – mikebrsv

2

何らかの認証を実装しない限り、実際には使用できません。つまり、角形ユーザーがAPIにサインインする必要があります。

あなたはです。はそれほど便利ではありません。たとえば、GETリクエストではなく、POSTリクエストを受け入れるようにルートを切り替えるだけで、ブラウザは簡単に表示されなくなります。それはまだdevのツールやカールに表示されます。

また、エクスプレスハンドラで探している角度要求でヘッダを設定することもできますが、これはセキュリティの外観のみに多くの作業があるようです。

0

ベスト・メソッドは、認証トークン・システムを実装することです。静的トークンを使用して開始することができます(後で、許可付きで動的トークンを実装できます)。

トークンは、要求が確実に認証される文字列です。

Node.jsのルート:

router.get('/api/articles', (req, res) => { 
    let token = url.parse(req.url,true).query.token; //Parse GET param from URL 
    if("mytoken" == token){   // Validate Token 
     Article.find({}, (err, articles) => { 
     if(err) return res.status(500).send("Something went wrong"); 
     res.status(200).send(articles); 
     }); 
    }else { 
     res.status(401).send("Error:Invalid Token"); //Send Error message 
    } 

}); 

角4サービス機能:エクスプレス

getArticles() { 
    return this.http.get('http://localhost:3000/api/articles?token=mytoken') // Add token when making call 
    .map(res => res.json()).subscribe(res => this.articles = res); 
} 
+1

@mikebrsv - ここで示唆されているようなブラウザのJavascriptから行うことができることは、あらゆるハッカーが行うことができるので、実際の予防ではなく障害に過ぎないことを理解する価値があります。そして、これはユーザーが単にブラウザにURLを入力するのを防ぐ最も簡単な方法ではありません.GETではなくPOSTを使用するようにAPIを変更するだけで済みます(RESTに準拠していませんが、 URLバーからのブラウザ要求はGETです)。 – jfriend00

0

、あなたのエンドポイントへのアクセスを許可または拒否するためにルートハンドラを使用することができます。この方法はPassport認証ミドルウェアで使用されています(これは、これで使用できます)。

function isAccessGranted (req, res, next) { 
    // Here your authorization logic (jwt, OAuth, custom connection logic...) 
    if (!isGranted) return res.status(401).end() 
    next() 
} 

router.get('/api/articles', isAccessGranted, (req, res) => { 
    //... 
}) 

またはすべてのあなたのルートのため、それはより一般的な作り:

app.use('*', isAccessGranted) 
関連する問題