node.js - 设置只有您的网络服务器才能看到的 API
问题描述
所以我想让 nginx 为我的 react 应用程序提供服务,该应用程序使用一个设置为为我进行所有 API 调用的 API。我想这样做是为了保护我的 API 密钥和秘密。所以 API 服务器在端口 9001 上运行,我的反应应用程序正在对http://localhost:9001/api/v1/token
. 它工作得很好。我遇到的问题是,如何阻止某人执行以下操作以获取令牌?
curl -X POST --header "referer: http://localhost:8081" -i http://localhost:8081/api/v1/token
谢谢
解决方案
如果您要问的是如何只允许您的反应应用程序使用您的 API 服务器,那么答案是您真的不能。
从浏览器发出的任何请求都必须发送到可以通过许多其他方式访问的服务器(例如您的 Curl 示例)。您不能只允许从您的 React 代码发出的请求,而不允许所有其他尝试与您的 API 服务器对话,因为在最低级别,这些都只是 http 请求。任何有决心的黑客都可以只看浏览器从你的 React 应用程序发送的内容,并发出一个看起来很像的 http 请求。这是 Web 浏览器中的应用程序如何工作的基本设计特征。
也就是说,您可以采取一些措施来“保护”您的 API 服务器免受滥用。
1. 需要某种形式的帐户或身份验证。 这至少需要黑客在您的系统中创建一个帐户并使用该帐户访问您的 API 服务器(稍后会详细介绍)。
2. 实施速率限制,以便个人帐户(根据上一步中的凭据检测)仅允许特定频率或模式或访问。至少,这可以保护您的 API 服务器不被一个不良行为者过度滥用。
3. 实施滥用控制。 如果某个特定帐户经常滥用 API 服务器(达到速率限制控制并且通常在您的 API 服务器上使用比任何合理的普通浏览器用户更多的资源),那么您可以禁止该帐户。
Google 地图等服务在努力保护其 API 服务器的完整性时实现了上述所有三个方面。
还有其他技术,例如将不断变化的令牌嵌入到网页中,然后每次后续调用 API 服务器都需要该令牌,但坚定的黑客只会从网页上抓取令牌,然后使用它直到它过期,所以这实际上只是黑客绕过的另一个障碍,而不是真正的障碍。
推荐阅读
- entity-framework - Cognos 框架加入问题
- android - 具有不同包名称的 Android 应用程序无法安装在同一设备上。
- c++ - 使用透明 std 函数对象时,我们还需要写空尖括号吗?
- javascript - 增加突出显示区域的大小的问题
- javascript - 使用 JavaScript 将十六进制转换为 Windows-1251
- android - 带有构造器的房间类型转换器
- c# - 为什么使用pdfbox在输出文件中显示正方形而不是符号
- c# - 努力支持的单元测试冲突
- c# - 如何从 Azure Blob 存储中获取今天修改的文件
- python - TypeError:只能将 str(不是“int”)连接到 str -(新学习者)