2017-10-19 78 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,否則您無法真正實現這種認證。

可以使它不那麼方便。例如,只需將您的路線切換爲接受POST請求而不是GET請求,將會阻止瀏覽器輕鬆查看。它仍然可以在開發工具或捲曲中看到。

或者,您可以在您的快速處理程序中設置一個包含您的角度請求的標頭,但是這看起來像只是安全外觀的許多工作。

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的最簡單方法 - 只需將API更改爲僅使用POST即可,而不是GET(這不是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)