Запустите стратегию надзирателя в devise, когда пользователь уже аутентифицирован - PullRequest
1 голос
/ 29 января 2020

Я использую devise для аутентификации моих пользователей через имя пользователя / пароль или пару провайдеров OAuth. Теперь я должен поддерживать собственную стратегию аутентификации, которая использует токен внутри заголовка.

module WardenStrategies
  class ApiKey < Warden::Strategies::Base
    def valid?
      api_token.present?
    end

    def authenticate!
      user = User.find_by(api_token: api_token)

      if user
        success!(user)
      else
        fail!("Invalid email or password")
      end
    end

    private

    def api_token
      env["HTTP_AUTHORIZATION"].to_s.remove("Bearer ")
    end
  end
end

Я добавил стратегию для разработки и защиты

# config/initializers/devise.rb
Devise.setup do |config|
  # ...
  config.warden do |manager|
    manager.default_strategies(:scope => :user).unshift :api_key
  end
  # ...
end
# config/initializers/warden.rb
Warden::Strategies.add(:api_key, WardenStrategies::ApiKey)

Проблема сейчас: у меня есть площадка на том же сайте, которая отправляет запросы в мой API через JavaScript. На игровой площадке я могу предоставить пользовательский ключ API для другого пользователя. Но когда пользователь уже вошел в систему с помощью обычного сеанса, надзиратель больше не запускает стратегию, потому что у него уже есть назначенный пользователь.

Итак, как я могу принудить надзирателя / разработать стратегию, даже если пользователь уже аутентифицирован?

1 Ответ

1 голос
/ 29 января 2020

Перед вызовом любой стратегии начальник проверяет, есть ли уже сохраненный пользователь в сеансе (по предыдущим запросам, когда какая-то стратегия с store? = true (по умолчанию) была успешной)

Вы можете попробовать подделать ' не установленный пользователь (без полного выхода из системы) чем-то вроде:

# manager is Warden::Manager
manager.prepend_on_request do |proxy|
  proxy.set_user(nil, scope: :user, store: false) if proxy.env["HTTP_AUTHORIZATION"].present?
end

PS. Ваша стратегия, вероятно, также должна иметь def store?; false; end, поскольку ключи API обычно требуются при каждом запросе, а также не должны приводить к сохранению сеанса

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...