在grape api端点中验证活动的admin用户

时间:2016-10-07 15:45:23

标签: ruby-on-rails cookies activeadmin session-cookies grape-api

所以这是我的应用程序的组件

管理面板位于myapp.com/admin上,使用主动管理员构建。然后我在用AngularJs构建的dashboard.myapp.com上为用户提供了一个仪表板,然后我在myapp.com/api上用葡萄构建了api。

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

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

现在确定会话是否被捕获很容易,因为我已经有了cookie。但是如何验证管理员用户是否已登录? 因为在葡萄api端点中无法调用活动的管理方法和帮助程序。 我可以通过cookie或会话实现这一目标吗?任何帮助将受到高度赞赏

由于

1 个答案:

答案 0 :(得分:2)

所以这就是我如何解决这个问题的.. 我使用加密会话设置另一个cookie admin_session,然后从仪表板返回与标题相同的cookie。

在葡萄终点中,我解密了会话并获得了管理员用户的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 {}