【发布时间】:2015-01-13 18:27:12
【问题描述】:
我需要手动反序列化会话 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 服务器。对于这些,我需要(重新)对用户进行身份验证。如果有人看到这样做的不同(更好)方式,我会很高兴阅读它。 :)
【问题讨论】:
标签: ruby ruby-on-rails-4 devise session-cookies warden