【发布时间】:2015-05-24 19:54:39
【问题描述】:
我一直在使用 Devise 处理我的 Rails 应用程序的身份验证,但从未真正了解它是如何工作的。因为 Devise 还使用 Rails 上设置的会话存储配置,所以我假设这是关于使用 Rails 处理会话的问题。
基本上,我是一个认证新手。我已经阅读了一些关于身份验证的文章,但大多数文章都涉及对我来说没有多大意义的抽象库(他们谈论引擎、中间件等)。我真的在寻找较低级别的细节。
这是我目前所知道的......
我知道 cookie 和会话。 Cookie 是存储在客户端的字符串,用于跨多个 HTTP 请求维护会话。
这是我对身份验证的基本理解(如果我错了,请纠正我):
当用户登录时,我们向服务器发送 SSL 加密请求。如果凭证有效,我们会在数据库(或任何其他数据存储)上保存一个名为会话 ID 的随机字符串,作为与用户 ID 关联的有效会话 ID。此会话 ID 会随着用户的每次登录/注销而改变。
在我们的数据存储中保存该会话 ID 后,我们返回一个响应,要求浏览器设置一个带有会话 ID 的 cookie。这个会话 id 和用户 id 将被发送到域的连续请求,直到它过期。对于每个请求,我们的服务器将检查标头上的会话 ID 并验证该会话 ID 是否对该用户 ID 有效。如果是,则认为该用户已通过身份验证。
这是我的问题:
我读到默认情况下从 Rails 2 开始,它现在使用 CookieStore(而不是 SessionStore),它使用 SHA512(而不是会话 ID)生成会话哈希,所有这些都存储在 cookie 中,这意味着多个用户 id 可以从字面上具有相同的会话哈希,它会正常工作。在我看来,这是一件非常危险的事情,使用存储在服务器上的单个密钥公开大量哈希,并基于此密钥建立整个身份验证系统。是否存在使用散列而不是存储服务器端会话 ID 的真实世界大型应用程序?
关于在服务器端存储活动会话 ID 的主题,我还读到您可以切换到使用不同类型的 Rails 会话存储。基于此,我听说过系统将身份验证系统作为服务移出,并改用身份验证令牌。什么是身份验证令牌,它与会话 ID 有何不同?
似乎我可以一直猜测一个随机字符串(对于散列和服务器端会话)来获取现有会话。有没有办法防止这种情况?使用存储在 cookie 上的更多值是否正常? (例如用户名、真实姓名甚至是用于身份验证的其他哈希)
我知道我问了很多,但我相信这对于像我这样不了解身份验证的人很有用,并且对于打下关于该主题的坚实基础非常有用。
【问题讨论】:
-
这是一个非常好的问题,Devise 的默默无闻长期以来一直是我们公司采用的障碍。将密切关注这一点。
-
所产生的哈希不仅仅是由登录用户的属性组成。即您无法生成重复的 SHA1 哈希。
标签: ruby-on-rails session authentication cookies devise