我正在开发 Web 应用程序。应用程序应该是 RESTful。我是 REST 新手。现在我无法理解如何正确完成用户登录/注销以满足 REST 限制。
我花了很多时间来了解 REST,并且已经阅读了 StackOverflow 上的许多文章和答案。我也了解“无国籍”的基本原则及其好处。因此,请不要在 Wikipedia 和有关 REST 的基本资源上提供链接。
关于任务:我在服务器上的数据库中有书籍列表。拥有登录名/密码的用户可以来到网站,输入登录名/密码并查看这些书籍的页面。因此,在回答书籍列表之前,服务器需要确保用户有权这样做。
书籍列表将由浏览器的 AJAX 调用请求。
我要制作服务器来处理 URL /books 。当服务器收到对此 URL 的 GET 请求时 - 它应该 1) 验证此调用;2) 如果可以 - 以 JSON 格式的书籍列表回答。
据我所知,REST 服务器的正确身份验证方法是对每个单独的调用进行身份验证。客户端应使用 Secret Access Key 和 Access Key ID 来加密查询参数。服务器将检查访问密钥 ID,检索秘密访问密钥(即共享密钥)并以这种方式验证查询。
所以服务器不处理会话,因为它违反了 REST 的“无状态”限制。我看到的唯一方法可以在没有会话的情况下完成 - 使用一些秘密访问密钥和访问密钥 ID 来加密查询参数。这就是通常的 REST 客户端的做法。但“普通”REST 客户端和浏览器 REST 客户端之间存在很大差异。普通 REST 客户端(可以说它是独立应用程序或服务器上的 PHP 应用程序)以某种安全方式存储其秘密访问密钥。没有人能看到它。但是 JS 应用程序将其存储在代码中。任何人都可以打开这个 JS 代码并找到这个密钥。
所以我的问题是:如何在浏览器(REST 客户端)和处理 REST API 的服务器之间组织身份验证,而不会将密钥暴露给任何可以开源代码的人。
还是我高估了在代码中存储秘密访问密钥的问题?我只是看到经典的“有状态”应用程序有很大的不同:如果我现在登录到某个站点并离开计算机 - 没有人可以来到计算机并在浏览器内存中的任何位置找到我的密码。但是通过在代码中存储秘密访问密钥是可能的。