如何使用 Express.js 将 API 访问限制为仅授权域?
Posted
技术标签:
【中文标题】如何使用 Express.js 将 API 访问限制为仅授权域?【英文标题】:How to restrict API access to only authorized domains using Express.js? 【发布时间】:2015-01-04 22:36:18 【问题描述】:我正在为我的 Node.js/Express.js 应用程序设置一层安全性,我想限制对 authlist
(授权列表)域的访问。
注意
authlist
的反义词是denylist
。
纲要:
用户在我的系统上创建Project
。
每个Project
都会发出一个Public Key
和Secret Key
,用于创建签名请求。
此外,任何给定Project
的管理员都需要提供他们希望能够访问给定Project
的API 的域的authlist
。这是在基于 Web 的控制台中完成的,而不是作为每个请求的一部分。
API 收到请求时,req.get('origin')
用于确定请求的源域。
根据authlist
检查来源,并相应地允许或拒绝。
在代码中:
var app = require('express');
app.post('/my-api-endpoint', function(req,res)
var originDomain = req.get('origin'); /// e.g. mysite.com
/// Origin is then checked against the authlist array of domains
);
问题
关于域来源,我需要注意哪些问题 欺骗? 这是一个值得的安全功能吗?或者它很容易被欺骗以至于没有必要打扰?【问题讨论】:
这可能适用于服务器,但对于您通常知道 IP 地址的服务器,因此使用它更容易。对于客户端,无法保证您看到的 IP 地址将与原始计算机相关,或者它根本不会解析为域。这不包括任何会使事情进一步复杂化的恶意活动。这可能不值得实施。 我实际上已经使用 IP 白名单实现了这个,但问题是,如果我有一个客户想要在 AWS Auto-Scaling-Group 这样的环境中托管他们的应用程序,那么他们就是不想在每次应用扩展时都更新 IP 白名单。感谢您的信息。 在我看来,您应该颁发身份验证凭据并以这种方式规范对 API 的访问。然后,您的客户可以使用他们想要的任何基础设施,而这不关您的事。 我想我会把它设为可选,如果他们有一个静态 IP 的服务器,用户可以打开 IP 白名单。 @AJB req.get('origin') 并不总是被定义为并非所有浏览器都可能不尊重发送它,用户可能会伪造标题中的来源,更不用说 req.get(' origin') 几乎总是在 HTTPS/SSL 上未定义,我假设您正在使用它。 【参考方案1】:完成您正在寻找的最佳方法是完全忘记域,并可选择允许将 IP 范围列入白名单。话虽如此,世界上一些最大的 API 甚至不使用这个安全层(即 eBay、亚马逊的 Marketplace 等......)。
不过,为了解决额外的偏执,您可以让您的客户设置子网来启动他们的自动缩放服务器,从而为他们提供一个静态 IP 范围以列入白名单。然后,只有在此 IP 范围内的服务器才会被授予访问您的端点的权限。
这是 AWS 上的一个问题,对此进行了更多解释: https://forums.aws.amazon.com/thread.jspa?threadID=233469
【讨论】:
以上是关于如何使用 Express.js 将 API 访问限制为仅授权域?的主要内容,如果未能解决你的问题,请参考以下文章
我们如何将二维码猴子 api 集成到 express.js 后端
如何从 Web 应用程序访问仅限身份验证的 Twitter API 方法