如何以RESTful风格实现用户身份验证?

时间:2014-10-27 03:31:13

标签: ruby-on-rails rest web-applications

我正在学习RESTful,并提出了这样一个问题:

由于RESTful Web服务要求服务器端不存储任何连接数据,我们如何实现用户登录?

传统方法可以使用服务器端会话来存储用户数据,但RESTful可以远离它。

一个明显的解决方案是,用户端每次访问新页面时始终发送用户名和密码,服务器端始终在执行所有操作之前对用户进行身份验证。但是,这种方法似乎非常难看,因为前端必须存储用户名/密码并在每个链接中发送它们,并且服务器必须检查数据库以进行身份​​验证,这似乎太慢了。

那么我们如何在不在服务器端存储任何跟踪信息的情况下实现任何用户认证机制呢?

1 个答案:

答案 0 :(得分:1)

实现身份验证的一种很好的REST方法是通过令牌。例如,只有经过身份验证的用户和服务器知道或可以推断的唯一且难以猜测的字符集合。

RESTful方法

为了简单起见,我假设它是基于JSON的Web服务,尽管该方法与XML或任何其他数据结构相同:

POST /tokens
BODY:
{"username": "my_user_name", "password": "thepassw0rd"}

成功验证将返回200 OK响应,并为用户添加新的唯一令牌:

200 OK
RESPONSE:
{token: 'wVXBbpBP4EnjpgENLUp7'}

然后,不是通过每个RESTful请求发送用户名/密码,而是通过HTTP标头发送令牌:

GET /some_resource
HEADERS:
X-Auth-Token: wVXBbpBP4EnjpgENLUp7

如果令牌无效(伪造,过期等),则可以返回401 Unauthorized HTTP状态。这样做的好处是身份验证不会干扰RESTful响应的结构。

<强>存储

可以生成不需要存储的令牌。一种方法是让令牌成为用户ID的加密字符串,类似于how Ruby on Rails encrypts session data client-side in a cookie。然而,这有一些缺点,即撤销令牌,设置令牌的到期或具有授权级别变得更加困难。除非您的服务立即具有Google大小的流量,否则如果您将每个令牌存储在服务器上,您将拥有更大的灵活性。