Node/Express - 限制访问路由但不影响静态文件

3
在我的MEAN应用程序中,我有一个API和静态网页文件,例如index.htmllogin.html
//Routes
app.use('/mysuperapi', require('./routes/api'));

//For static files
app.use(express.static('site'));

如果我不希望用户自由访问诸如 mysite.com/mysuperapi 的 URL,我在想是否有可能实现这一点呢?
调用 API 中的身份验证路由的页面(例如 login.html)将从用户的计算机上发生,因此我无法仅允许我的服务器以外的所有 IP 地址。
或者说所有的 API 都是公开的吗?
感谢任何建议。
谢谢。
1个回答

10

您可以通过添加另一个中间件层来限制对路由的访问,例如。

app.use('/mysuperapi/*', function(req, res, next) {
    // do your filtering here, call a `res` method if you want to stop progress or call `next` to proceed
    var ip = req.ip || 
             req.headers['x-forwarded-for'] || 
             req.connection.remoteAddress || 
             req.socket.remoteAddress ||
             req.connection.socket.remoteAddress;

     // Your allowed ip. You can also check against an array
     if (ip == '5.4.3.2') {
       next();
     } else {
        res.end();
     }
}

app.use('/mysuperapi', require('./routes/api'));

// ... the rest of your code

第一个app.use语句中的函数将在与该模式匹配的每个路径上被调用,并在到达API之前,因此您可以在那里限制访问。


太好了,看起来很清晰。但是我似乎不理解某些东西。如果某个用户在登录页面上并调用auth路由,则必须允许他们的IP。这是否意味着我实际上无法将API限制为仅通过网站访问的用户? - userMod2
此外,阻止的整个目的是为了防止API被“攻击”,例如如果有人知道授权路由,他们肯定会尝试一百万个用户名和密码。 - userMod2
如果您想限制仅从您的网站访问,则可能希望将访问控制标头设置为仅接收来自您的网站的调用,即 Access-Control-Allow-Origin: http://yoursite.com。您可以在此处查看参考资料 https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Access-Control-Allow-Origin - ruedamanuel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接