[英]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.