我在我的 Rails/Grape API 应用程序中配置了 Warden 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
在我的一生中,在查看在线示例(例如dblock/grape_warden)后,我无法让 Warden 正确使用 Grape 。大多数示例都很简单,并将 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 应用程序的根目录时,也会发生同样的情况。