我需要手动反序列化会话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服务器,它响应某些特权操作。对于这些我需要(重新)验证用户。如果有人看到了另一种(更好)的方式,我很乐意阅读它。 :)
答案 0 :(得分:0)
我描述的用于反序列化cookie的方式正确。它在Devise中实际上是相同的,关键只是改变了,我迅速得出结论,必须有一个不同的血清化过程。
答案 1 :(得分:-1)
您可以访问控制器中的session
对象。您使用什么密钥来存储user_id?您应该能够session[:key]
,所以如果您将ID存储为user_id,那么session[:user_id]
。
答案 2 :(得分:-1)
你必须使用Devise吗?我posted previously使用Warden滚动你自己完全控制的令牌身份验证。如果您决定像我一样轻松做事并自己实施身份验证,您会发现很容易通过模型从令牌中查找用户。