所以这是我的应用程序的组件
管理面板位于myapp.com/admin上,使用主动管理员构建。然后我在用AngularJs构建的dashboard.myapp.com上为用户提供了一个仪表板,然后我在myapp.com/api上用葡萄构建了api。
我的管理面板上有一个功能,管理员可以在另一个用户的仪表板上登录。我们称之为capture_session。基本上用户会话是由管理员捕获的,我们删除了一个cookie admin_capture,其值是admin_user的id。
现在这就是我想要实现的目标。在我的一个葡萄api端点中,我需要验证会话已被捕获,并且已捕获会话的管理员用户也登录管理面板。
现在确定会话是否被捕获很容易,因为我已经有了cookie。但是如何验证管理员用户是否已登录? 因为在葡萄api端点中无法调用活动的管理方法和帮助程序。 我可以通过cookie或会话实现这一目标吗?任何帮助将受到高度赞赏
由于
答案 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 {}