3

我有一个使用node.js 和 express.js构建的 api 。现在我有一个不安全的 api,任何人都可以在其中获取、发布、放置、删除记录。

我面临以下问题。我的rest api不应该对用户进行身份验证,而是对应用程序进行身份验证。例如,我的移动应用程序应该有一个有效的令牌来访问 api。对于 Web 应用程序也是如此。

另一个用户案例:我的 api 将被另一个只使用一个 rest 调用的应用程序使用。因此,在我不知道的应用程序中(大部分情况下)我不知道的代码中的某个地方将触发对我的 api 的休息调用。由于不涉及 cookie 或会话,我如何保护此类访问?

我的第一个想法是,创建一个用户和密码。每个 api 调用(通过 https)都必须包含凭据。密码可能会被散列。但是我读了这个

用户名和密码、会话令牌和 API 密钥不应出现在 URL 中,因为这可以在 Web 服务器日志中捕获并使其具有内在价值。

来自https://www.owasp.org/index.php/REST_Security_Cheat_Sheet

对此有何建议?我阅读了有关 oauth 的信息,但这涉及重定向,我无法想象这将如何与移动应用程序一起使用,例如在 android 上。

4

2 回答 2

2

您可以为此使用 RSA 加密,查看节点的ursa模块。
使用它的一个简化过程是......安排您的客户端应用程序使用公钥加密一个秘密密码,并在服务器端用一个私人密码解密它,检查秘密是否是您所期望的并采取相应的行动......

有很多关于在应用程序中使用 rsa 的文章,我相信如果你只是谷歌,你将能够获得关于如何工作的更明确的解释。

编辑
我刚刚碰到这篇文章,其中有关于这个问题的更详细的文章。

于 2013-10-05T19:10:05.173 回答
2

有一个问题是应用程序如何首先知道用户名/密码,但如果你对一般想法没意见(这是安全的,只要你认为应用程序运行的环境是安全的),那么您无需担心 URL 中的用户名/密码:只需使用 https 而不是 https。

https 是加密的,因此只有 2 个端点(客户端和您的 API)甚至可以读取 URL。介于两者之间的任何路由器/代理/服务器只能看到加密数据,并且无法访问您的用户名/密码。

顺便说一句,而不是用户名/密码,只需使用“访问令牌”,它是一个长(读取:难以猜测)字符串,并为每个应用程序分配一个访问令牌。最后,您将有效令牌列表保存在数据库中,并据此进行身份验证。如果您愿意,您甚至可以将到期日期附加到这些字符串。

添加访问令牌作为 https:// url 的一部分是常见的做法。

于 2013-10-05T20:40:52.403 回答