【发布时间】:2018-04-28 03:09:23
【问题描述】:
我正在编写一个前端和后端分开的网络应用程序。前端是用 React 编写的,后端是一个运行 Express 端点的 node.js 服务器。如何确保只有我的前端可以访问 API,其他任何人都不能访问?我的 API URL 暴露在我的前端客户端代码中,所以任何人都可以看到。
我向我的 API 添加了 JWT 身份验证,但我仍然需要一个不受保护的 /login 端点才能生成 JWT 令牌,并且为了登录以生成令牌,我必须从我的前端,其他用户可以看到,因为它是从客户端完成的。
保护托管在这样的单独后端上的 API 的正确方法是什么,以便只有我的前端可以访问它,而没有人可以看到正在使用哪些凭据来访问端点?
【问题讨论】:
-
你不能。您的 API 在互联网上。任何人都可以访问它。在允许访问 API 之前,您可以要求该帐户的帐户和登录凭据,但是一旦有人拥有帐户和凭据,他们就可以从自己的脚本而不是通过您的网页访问 API。这就是网络的工作方式。您对此无能为力。并且无法隐藏客户端正在使用的凭据。客户端上的所有数据都可以被客户端上的黑客查看。这就是网络的方式。
-
哦,我明白了。这就说得通了。公司一般如何处理这个问题?例如,对于像 Reddit 这样的网站,我敢肯定,如果黑客获得了 API 凭据,他们将很容易发布一百万个帖子。凭证通常如何存储?现在它们实际上只是在我的客户端代码中。
-
大公司通常会监控其 API 使用情况,以寻找不当使用。这包括速率限制、检测非普通用户典型的行为和序列。当他们发现不当使用时,他们通常会暂时或永久禁止违规帐户。这也是为什么一些页面使用技术来检测是否是一个真正的人单独导致了诸如 reCaptcha 之类的操作。
-
啊,我明白了。这些绝对看起来像是保护 API 的一些很好的理智措施。在存储实际凭据以从我的前端访问 API 方面,您认为将它们存储在 JSON 文件中然后将该文件加载到客户端变量中是否可以?或者有没有办法让人们轻松查看我的客户端文件的内容?
-
我不知道你在想什么在本地存储凭据,但如果这是在浏览器中运行的 Javascript(我假设你的意思是 React 前端),那么 Javascript 不会有权访问文件系统。您可以使用 cookie 或本地存储或更新的存储 API,如 IndexdDB API。
标签: api security express jwt backend