我需要手动反序列化 session cookie 以从中提取用户。环境是rails,虽然它不在http服务器上下文中,所以没有要求设计自动反序列化。有 Warden::SessionSerializer,虽然我并没有真正了解如何使用它。
在我没有使用 Devise 之前,我使用这种方法反序列化 Rails session 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 进行身份验证, session 当然存储在 cookie 中。 Rails 还运行 (rails runner) 响应某些特权操作的 websocket 服务器。对于这些,我需要(重新)验证用户。如果有人看到不同的(更好的)方法,我很乐意阅读它。 :)
最佳答案
我描述的反序列化 cookie 的方式是正确的。在 Devise 中实际上是一样的,键只是改变了,我很快就得出结论,一定有一个不同的序列化过程在进行。
关于ruby - 从设备/管理员 session cookie 中获取用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26962593/