繁体   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