Подход
slainer68 хорош, но он не работает для меня как есть, поэтому я добавлю свое возможное решение здесь.
В config/initializers/devise.rb
, в котором уже был блок Devise.setup do |config| ... end
,Я добавил следующее:
Warden::Strategies.add(:my_token_authenticatable, Devise::Strategies::TokenAuth
def valid?
mapping.to.respond_to?(:authenticate_with_token) && authentication_token(scope).present? && params[:controller] == 'photos' && params[:action] == 'create'
end
end
Я также добавил это в блок Devise.setup
:
config.warden do |manager|
manager.default_strategies.unshift :my_token_authenticatable
end
Было бы лучше просто обновить существующую стратегию :token_authenticatable
, ноэто не было загружено в Warden к тому времени, когда этот код был выполнен.В результате использования стратегии с другим именем мне пришлось продублировать некоторые методы и методы класса из Devise::Strategies::TokenAuthenticatable
, в том числе:
reset_authentication_token
reset_authentication_token!
self.authenticate_with_token(attributes)
self.token_authentication_key
valid_authentication_token?(incoming_auth_token)
self.find_for_token_authentication(token)
Мне также пришлосьremove: token_authenticatable из строки devise
в верхней части модели User.
Я также воспользовался советом slainer68 и добавил :stateless_token => false
в опции для devise_for
в config/routes.rb
.