Devise API sign_in 不适用于邮递员
Devise API sign_in doesn't work with postman
我在 API 模式下使用 Rails 6 和最新版本的设计。
我为 sign_in 和 sign_up 创建了 rspec 测试并且它工作正常他们接受 json 答案并在 json
中回复
当我尝试使用邮递员测试我的 API 时,它适用于 sign_up 但不适用于 sign_in。
通过邮递员,我得到了以下 return
{
"sucess": false,
"message": "fail myapp_failure_app"
}
所以我尝试挖掘 devise gem
问题,我终于发现问题出在这里
def create
self.resource = warden.authenticate!(auth_options)
...
end
而在warden gem
中问题出现在方法_run_callbacks(*args)
def _run_callbacks(*args) #:nodoc:
self.class._run_callbacks(*args)
end
传递给此方法的参数是:
[:after_set_user, #<User id: 4, nickname: "max", email: "test@test", birth_at: nil, created_at: "2020-01-12 22:44:19", updated_at: "2020-01-13 21:44:57">, Warden::Proxy:70223361236700 @config={:default_scope=>:user, :scope_defaults=>{}, :default_strategies=>{:user=>[:jwt, :rememberable, :database_authenticatable]}, :intercept_401=>false, :failure_app=>MyappFailureApp}, {:scope=>:user, :recall=>"sessions#new", :store=>true, :event=>:authentication}]
如果我把方法改成这个
def _run_callbacks(*args) #:nodoc:
return
self.class._run_callbacks(*args)
end
运行良好。
我希望通过深入研究 gem 并将我的结果与我的规范进行比较来自己找到解决方案,但老实说,我不明白这种方法的真正作用以及它与我的规范不同的原因。
Devise
在 warden
上定义了多个钩子,它们通过 _run_callbacks
方法调用。
看起来您在其中一个回调挂钩中失败了。钩子可以在 Devise source 中找到。
另外,您的 MyappFailureApp
并没有真正显示错误,是否可以定义一个更好的错误?像 -
class MyappFailureApp < Devise::FailureApp
def respond
http_auth
end
def http_auth
self.status = 401
self.headers["WWW-Authenticate"] = %(Bearer realm=#{Devise.http_authentication_realm.inspect}) if http_auth_header?
self.content_type = 'application/json'
self.response_body = http_auth_body
end
def http_auth_body
{ error: [i18n_message] }.to_json
end
def request_format
:json
end
end
我在 API 模式下使用 Rails 6 和最新版本的设计。
我为 sign_in 和 sign_up 创建了 rspec 测试并且它工作正常他们接受 json 答案并在 json
中回复当我尝试使用邮递员测试我的 API 时,它适用于 sign_up 但不适用于 sign_in。
通过邮递员,我得到了以下 return
{
"sucess": false,
"message": "fail myapp_failure_app"
}
所以我尝试挖掘 devise gem
问题,我终于发现问题出在这里
def create
self.resource = warden.authenticate!(auth_options)
...
end
而在warden gem
中问题出现在方法_run_callbacks(*args)
def _run_callbacks(*args) #:nodoc:
self.class._run_callbacks(*args)
end
传递给此方法的参数是:
[:after_set_user, #<User id: 4, nickname: "max", email: "test@test", birth_at: nil, created_at: "2020-01-12 22:44:19", updated_at: "2020-01-13 21:44:57">, Warden::Proxy:70223361236700 @config={:default_scope=>:user, :scope_defaults=>{}, :default_strategies=>{:user=>[:jwt, :rememberable, :database_authenticatable]}, :intercept_401=>false, :failure_app=>MyappFailureApp}, {:scope=>:user, :recall=>"sessions#new", :store=>true, :event=>:authentication}]
如果我把方法改成这个
def _run_callbacks(*args) #:nodoc:
return
self.class._run_callbacks(*args)
end
运行良好。
我希望通过深入研究 gem 并将我的结果与我的规范进行比较来自己找到解决方案,但老实说,我不明白这种方法的真正作用以及它与我的规范不同的原因。
Devise
在 warden
上定义了多个钩子,它们通过 _run_callbacks
方法调用。
看起来您在其中一个回调挂钩中失败了。钩子可以在 Devise source 中找到。
另外,您的 MyappFailureApp
并没有真正显示错误,是否可以定义一个更好的错误?像 -
class MyappFailureApp < Devise::FailureApp
def respond
http_auth
end
def http_auth
self.status = 401
self.headers["WWW-Authenticate"] = %(Bearer realm=#{Devise.http_authentication_realm.inspect}) if http_auth_header?
self.content_type = 'application/json'
self.response_body = http_auth_body
end
def http_auth_body
{ error: [i18n_message] }.to_json
end
def request_format
:json
end
end