Аутентификация активного пользователя-администратора в конечной точке виноградного API

Итак, вот компоненты моего приложения

панель администратора находится на myapp.com/admin, созданная с активным администратором. затем у меня есть панель инструментов для пользователей на панели инструментов.

У меня есть функция на моей панели администратора, где администратор может войти в панель управления как другой пользователь. мы называем это Capture_session. в основном сеанс пользователя захватывается администратором, и мы сбрасываем файл cookie admin_capture, значение которого является идентификатором пользователя admin_user.

теперь вот чего я хочу добиться. в одной из моих конечных точек API винограда мне нужно подтвердить, что сеанс захвачен и что пользователь-администратор, который захватил сеанс, также вошел в систему на панели администратора.

теперь выяснить, захвачен сеанс или нет, легко, поскольку у меня уже есть файл cookie для этого. но как я могу проверить, что пользователь admin вошел в систему? поскольку активные методы администратора и помощники не могут быть вызваны в конечной точке API винограда. Могу ли я добиться этого с помощью файлов cookie или сеансов? любая помощь будет высоко оценена

Спасибо


person Aitizazk    schedule 07.10.2016    source источник


Ответы (1)


Итак, вот как я решил эту проблему. Я установил другой файл cookie admin_session с зашифрованным сеансом, а затем вернул тот же файл cookie в качестве заголовка с панели инструментов.

В конечной точке винограда я расшифровал сеанс и получил идентификатор пользователя-администратора и начальную часть зашифрованного пароля. и использовал эту информацию для проверки admin.

вот код.

  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 {}
person Aitizazk    schedule 13.10.2016