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

时间:2013-05-04 15:46:50

标签: rest authentication browser request

我正在开始开发Web应用程序。应用程序应该是RESTful。 我是REST的新手。现在我无法理解如何正确完成用户登录/注销以满足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的服务器之间组织身份验证,而不向任何可以打开源代码的人公开密钥。

或者我是否高估了在代码中存储秘密访问密钥的问题? 我只看到与经典“有状态”应用程序的巨大差异:     如果我现在登录到某个站点并且没有计算机 - 没有人可以来到计算机并在浏览器的内存中找到我的密码。     但是在代码中存储Secret Access Key是可能的。

1 个答案:

答案 0 :(得分:0)

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

headers : { "Authorization" : "customAuth" }