当REST客户端是浏览器时,如何正确开发REST查询的身份验证

当REST客户端是浏览器时,如何正确开发REST查询的身份验证,rest,authentication,browser,request,Rest,Authentication,Browser,Request,我正在开发web应用程序。应用程序应该是RESTful的。 我刚开始休息。现在我无法理解如何正确地完成用户登录/注销以满足REST限制 我花了很长时间来理解REST,并且已经阅读了许多关于StackOverflow的文章和答案。我也了解“无国籍”的基本原则及其好处。所以,请不要在维基百科和关于REST的基本资源上链接 关于任务: 我有服务器上数据库中的书籍列表。拥有登录名/密码的用户可以访问站点,输入登录名/密码并查看这些书籍的页面。所以在回答图书列表问题之前,服务器需要确保用户有权这样做 AJ

我正在开发web应用程序。应用程序应该是RESTful的。 我刚开始休息。现在我无法理解如何正确地完成用户登录/注销以满足REST限制

我花了很长时间来理解REST,并且已经阅读了许多关于StackOverflow的文章和答案。我也了解“无国籍”的基本原则及其好处。所以,请不要在维基百科和关于REST的基本资源上链接

关于任务: 我有服务器上数据库中的书籍列表。拥有登录名/密码的用户可以访问站点,输入登录名/密码并查看这些书籍的页面。所以在回答图书列表问题之前,服务器需要确保用户有权这样做

AJAX调用将从浏览器请求书籍列表

我将使服务器处理URL/书籍。当服务器接收到此URL的GET请求时-它应该 1) 验证此呼叫; 2) 如果确定-回答JSON格式的书籍列表

据我所知,到目前为止,REST服务器的正确身份验证方法是对每个单独的调用进行身份验证。客户端应该使用秘密访问密钥和访问密钥ID来加密查询参数。服务器将检查访问密钥ID,检索秘密访问密钥(即共享密钥),并以这种方式验证查询

所以服务器不处理会话,因为它违反了REST的“无状态”限制。 我认为,在没有会话的情况下,这是唯一可以实现的方法——使用一些秘密访问密钥和访问密钥ID来加密查询参数。REST客户机通常就是这样做的。但“普通”REST客户端和浏览器REST客户端之间有很大的区别。 普通的REST客户端(假设它是服务器上的独立应用程序或PHP应用程序)以某种安全的方式存储其秘密访问密钥。没有人能看到它。但JS应用程序将其存储在代码中。任何人都可以打开这个JS代码并找到这个密钥

所以我的问题是: 如何在浏览器(REST客户端)和处理REST API的服务器之间组织身份验证,而不向任何可以打开源代码的人公开密钥

或者我高估了在代码中存储秘密访问密钥的问题? 我只是看到了与经典的“有状态”应用程序的巨大区别: 如果我现在登录到某个站点并从计算机中退出,则没有人可以来到计算机并在浏览器内存中的任何位置找到我的密码。
但是,将秘密访问密钥存储在代码中是可能的。

尝试使用基本身份验证,它适用于基于浏览器的应用程序。但问题是,它总是会向用户抛出一个弹出窗口。另一种方法是使用自定义登录头对每个REST请求进行身份验证,例如

headers : { "Authorization" : "customAuth" }