Я использую 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 для другого пользователя. Но когда пользователь уже вошел в систему с помощью обычного сеанса, надзиратель больше не запускает стратегию, потому что у него уже есть назначенный пользователь.
Итак, как я могу принудить надзирателя / разработать стратегию, даже если пользователь уже аутентифицирован?