在 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 {}
这是我的应用程序的组件
管理面板在 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 {}