Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/52.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何以RESTful风格实现用户身份验证?_Ruby On Rails_Rest_Web Applications - Fatal编程技术网

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

Ruby on rails 如何以RESTful风格实现用户身份验证?,ruby-on-rails,rest,web-applications,Ruby On Rails,Rest,Web Applications,我正在学习RESTful,并提出了这样一个问题: 由于RESTfulWeb服务要求服务器端不存储任何连接数据,我们如何实现用户登录 传统的方法可以使用服务器端会话来存储用户数据,但RESTful却无法实现 一个明显的解决方案是,用户端总是在每次访问新页面时发送用户名和密码,服务器端总是在用户做任何事情之前对其进行身份验证。然而,这种方法看起来非常丑陋,因为前端必须存储用户名/密码并在每个链接中发送它们,服务器必须检查数据库以进行身份验证,这似乎太慢了 那么,我们如何在不在服务器端存储任何跟踪信息

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

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

传统的方法可以使用服务器端会话来存储用户数据,但RESTful却无法实现

一个明显的解决方案是,用户端总是在每次访问新页面时发送用户名和密码,服务器端总是在用户做任何事情之前对其进行身份验证。然而,这种方法看起来非常丑陋,因为前端必须存储用户名/密码并在每个链接中发送它们,服务器必须检查数据库以进行身份验证,这似乎太慢了


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

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

RESTful方法

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

POST /tokens
BODY:
{"username": "my_user_name", "password": "thepassw0rd"}
成功的验证将返回200 OK响应,并为用户提供一个新的唯一令牌:

200 OK
RESPONSE:
{token: 'wVXBbpBP4EnjpgENLUp7'}
然后通过HTTP头发送令牌,而不是在每个RESTful请求中发送用户名/密码:

GET /some_resource
HEADERS:
X-Auth-Token: wVXBbpBP4EnjpgENLUp7
如果令牌无效(伪造、过期等),则可以返回401未经授权的HTTP状态。这样做的优点是身份验证不会干扰RESTful响应的结构

存储


可以生成不需要存储的令牌。一种方法是让令牌具有用户id的加密字符串,类似于。然而,这也有一些缺点,即撤销令牌、设置令牌到期时间或具有授权级别变得更加困难。除非你的服务马上会有谷歌大小的流量,否则如果你将每个令牌存储在服务器上,你会有更多的灵活性

您可以创建类似于ApiKey的
model。它可以生成访问令牌。然后,您将通过先前生成的访问用户令牌查找
ApiKey
。您可能还希望向
ApiKey
添加额外的限制,如expires\u in等。因此,在每次请求之前,如果您使用访问令牌未找到
ApiKey
,您可以从控制器方法返回
head:unauthorized
。另外,请检查这一点,这样即使使用RESTful,我们仍然需要某种服务器端存储?只是想澄清一下,您是在谈论使用第三方RESTful web服务还是构建自己的RESTful API?我是说构建自己的RESTful API。我试图了解什么是最佳实践,而不是仅仅使用已经构建的东西。当您进行自己的身份验证时,您将始终需要某种服务器端存储。至少您需要存储每个用户的用户名和哈希密码。虽然从技术上讲,不在服务器上存储每个令牌是可能的,但是要记住我上面提到的一些安全性和灵活性方面的考虑。身份验证令牌被认为是最佳实践,是OAuth等协议的基础