在 grape api 端点验证活动管理员用户

Authenticate active admin user in grape api endpoint

这是我的应用程序的组件

管理面板在 myapp 上。com/admin 使用活跃的管理员构建。然后我在 dashboard.myapp.com 有一个用 AngularJs 构建的用户仪表板,然后我在 myapp.com/api.

用 grape 构建了 api

我的管理面板上有一个功能,管理员可以在其中以其他用户身份登录仪表板。我们称之为 capture_session。基本上,用户会话由管理员捕获,我们删除一个 cookie admin_capture,其值是 admin_user.

的 id

现在这就是我想要实现的目标。在我的 grape api 端点之一中,我需要验证会话是否已被捕获,并且捕获会话的管理员用户是否也在管理面板上登录。

现在弄清楚会话是否被捕获很容易,因为我已经有一个 cookie。但是如何验证管理员用户是否已登录? 因为无法在 grape api 端点中调用活动的管理方法和助手。 我可以用 cookies 或 session 实现吗?任何帮助将不胜感激

谢谢

这就是我解决这个问题的方法.. 我用加密的 session 设置了另一个 cookie admin_session,然后从仪表板返回了与 header 相同的 cookie。

在 grape 端点中,我解密了 session 并获得了管理员用户的 ID 和加密密码的初始部分。并使用此信息来验证管理员。

这是代码。

  admin_id      = ADMIN_ID_HEADER
  admin_session = ADMIN_SESSION_HEADER
  admin_user    = AdminUser.find_by_id(admin_id)
  return unless admin_id.present? && admin_session.present? && admin_user.present?

  salt          = Rails.application.config.action_dispatch.encrypted_cookie_salt
  signed_salt   = Rails.application.config.action_dispatch.encrypted_signed_cookie_salt
  key_generator = ActiveSupport::KeyGenerator.new(ENV['SECRET_KEY_BASE'], :iterations => 1000)
  secret        = key_generator.generate_key(salt)
  signed_secret = key_generator.generate_key(signed_salt)
  encryptor     = ActiveSupport::MessageEncryptor.new(secret, signed_secret, :serializer => ActiveSupport::MessageEncryptor::NullSerializer)
  session_data  = JSON.parse(encryptor.decrypt_and_verify(CGI::unescape(admin_session))) rescue {}