从设备/看守会话cookie中获取用户

时间:2014-11-16 22:05:55

标签: ruby ruby-on-rails-4 devise session-cookies warden

我需要手动反序列化会话cookie以从中提取用户。环境是rails,虽然它不在http服务器上下文中,因此没有请求设计自动反序列化。有Warden :: SessionSerializer,虽然我没有真正了解如何使用它。

在我没有使用Devise之前,我使用此方法反序列化rails会话cookie:

def decrypt_cookie(cookie)
  cookie = CGI.unescape(cookie)
  config = Rails.application.config

  encrypted_cookie_salt = config.action_dispatch.encrypted_cookie_salt
  encrypted_signed_cookie_salt = config.action_dispatch.encrypted_signed_cookie_salt

  key_generator = ActiveSupport::KeyGenerator.new(config.secret_key_base, iterations: 1000)
  secret = key_generator.generate_key(encrypted_cookie_salt)
  sign_secret = key_generator.generate_key(encrypted_signed_cookie_salt)

  encryptor = ActiveSupport::MessageEncryptor.new(secret, sign_secret)
  encryptor.decrypt_and_verify(cookie)
end

由于某些人可能会怀疑是否存在手动反序列化cookie的上下文: 客户端(浏览器)通过HTTP进行身份验证,会话当然存储在cookie中。 Rails还运行(rails runner)websocket服务器,它响应某些特权操作。对于这些我需要(重新)验证用户。如果有人看到了另一种(更好)的方式,我很乐意阅读它。 :)

3 个答案:

答案 0 :(得分:0)

我描述的用于反序列化cookie的方式正确。它在Devise中实际上是相同的,关键只是改变了,我迅速得出结论,必须有一个不同的血清化过程。

答案 1 :(得分:-1)

您可以访问控制器中的session对象。您使用什么密钥来存储user_id?您应该能够session[:key],所以如果您将ID存储为user_id,那么session[:user_id]

答案 2 :(得分:-1)

你必须使用Devise吗?我posted previously使用Warden滚动你自己完全控制的令牌身份验证。如果您决定像我一样轻松做事并自己实施身份验证,您会发现很容易通过模型从令牌中查找用户。