Я настроил 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.