【问题标题】:Get user from device/warden session cookie从设备/管理员会话 cookie 中获取用户
【发布时间】: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


    【解决方案1】:

    您可以在控制器中访问session 对象。您使用什么键来存储 user_id?你应该可以做到session[:key],所以如果你将id存储为user_id,那么session[:user_id]

    【讨论】:

    • 虽然我将脚本作为 Rails 脚本启动(因此加载了一般环境),但它不在控制器内部,所以 devise 没有为我做任何反序列化。
    • 如果您可以访问 Warden 对象(考虑到您的问题,我假设您可以在脚本中访问),那么您可以使用 #{warden_instance}.request.session 我相信
    • 也没有请求,是从非http上下文启动的
    • 如果没有请求,如何进行会话?如何/何时创建会话?
    • 好吧,在另一个上下文中,还有一个正在运行的 rails http 服务器,会话在其中创建。但在脚本的上下文中,我只有 cookie。
    【解决方案2】:

    我描述的反序列化 cookie 的方法是正确的方法。在 Devise 中实际上是一样的,只是更改了键,我很快就得出结论,肯定有不同的序列化过程正在进行。

    【讨论】:

      【解决方案3】:

      您必须使用设计吗?我posted previously 使用 Warden 来滚动你自己的令牌身份验证,你可以完全控制它。如果您决定像我一样只做简单的事情并自己实现身份验证,您会发现通过您的模型从令牌中查找用户很容易。

      【讨论】:

      • 是的,谢谢,但需要设计。我编写自己的确认/重置/...逻辑,但我喜欢设计处理它的方式。
      猜你喜欢
      • 2011-12-28
      • 2012-05-21
      • 2017-03-09
      • 2011-03-24
      • 2012-02-09
      • 2020-11-03
      • 2017-07-17
      • 1970-01-01
      • 2010-11-26
      相关资源
      最近更新 更多