Настройка Warden с помощью приложения Grape API

Я настроил Warden в своем приложении Rails/Grape API в config/initializers/warden.rb:

Rails.application.config.middleware.use Warden::Manager do |manager|
  manager.default_strategies :password
end

(Я бы поделился кодом стратегии password, но он действительно не относится к этому вопросу. Он хранится у меня в config/initializers/warden/strategies/password.rb.)

Когда я запускаю спецификацию запроса RSpec с неверными учетными данными для входа:

describe 'session_tokens', type: :request do
  let!(:user)      { FactoryGirl.create(:user) }
  let(:ip_address) { Faker::Internet.ip_v4_address }

  describe 'POST /' do
    context 'with invalid password' do
      before do
        post '/api/v1/session_tokens', email: user.email, password: "#{user.password}.", ip: ip_address
      end

      it 'is unsuccessful' do
        expect(response.code).to eql '401'
      end

      it 'has an "X-Error-Detail" header' do
        expect(response.header['X-Error-Detail']).to eql 'Invalid email or password.'
      end
    end
  end
end

Это дает мне эту ошибку:

Failure/Error: post '/api/v1/session_tokens', email: user.email, password: "#{user.password}.", ip: ip_address
RuntimeError:
   No Failure App provided

На всю жизнь я не могу заставить Warden правильно работать с Grape после просмотра примеров в Интернете (например, dblock/grape_warden< /а>). Большинство примеров просты и устанавливают само приложение Grape как приложение с ошибкой.

Когда я передаю модуль в своем приложении Grape как failure_app:

Rails.application.config.middleware.use Warden::Manager do |manager|
  manager.default_strategies :password
  manager.failure_app = -> (env) { API::V1::SessionTokens }
end

Я получаю эту ошибку, хотя у меня есть блок post :unauthenticated в этом модуле:

Failure/Error: post '/api/v1/session_tokens', email: user.email, password: "#{user.password}.", ip: ip_address
NoMethodError:
  undefined method `unauthenticated' for API::V1::SessionTokens:Class

То же самое происходит, когда я перемещаю определение unauthenticated в корень моего приложения Grape.


person Chris Peters    schedule 24.10.2014    source источник


Ответы (1)


Решение состояло в том, чтобы настроить Warden в самом приложении Grape, а не в инициализаторе Rails.

Я удалил config/initializers/warden.rb и поместил его содержимое в свое приложение Grape следующим образом:

module API
  module V1
    class Base < Grape::API
      mount API::V1::SessionTokens

      use Warden::Manager do |manager|
        manager.default_strategies :password
        manager.failure_app = API::V1::SessionTokens
      end
    end
  end
end

Теперь работает отлично!

Спасибо Жану Бахнику за этот файл на GitHub, в частности . Я нашел этот прекрасный фрагмент кода после того, как почти сдался.

person Chris Peters    schedule 24.10.2014