簡體   English   中英

保護Node.js中的API路由

[英]Protect API routes in Node.js

我的Node.js API中有一些路由,用於將數據從MongoDB數據庫發送到Angular 4前端。

例:

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);
    });
});

Angular 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格式的文章。

這不是安全措施 ,只是一種過濾請求的方法。 為了安全起見,請使用其他機制,例如JWT或類似機制。

如果有角度的應用是由您控制的,則發送一個特殊的標頭,例如X-Requested-With:XMLHttpRequest (chrome默認將其發送給AJAX調用),然后在響應之前檢查此標頭的存在。

如果您真的很想將端點暴露在特殊情況下,請使用唯一的標頭可能是X-Request-App: MyNgApp並對其進行過濾。

除非您願意實施某種身份驗證,否則您就無法真正做到-即,您的有角度的用戶將需要登錄api。

可以減少它的便利性。 例如,僅將您的路由切換為接受POST請求而不是GET請求,將阻止瀏覽器輕松查看它。 它仍將在開發工具或curl中可見。

或者,您可以在快速處理程序中查找帶有角度請求的標頭,但這似乎很繁瑣,僅出於安全方面。

最好的方法是實現身份驗證令牌系統。 您可以從靜態令牌開始(以后可以通過授權實現動態令牌)。

令牌只是一個字符串,以確保對請求進行身份驗證。

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
    }

});

Angular 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);
}

借助Express ,您可以使用路由處理程序來允許或拒絕對端點的訪問。 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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM