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 并将我的结果与我的规范进行比较来自己找到解决方案,但老实说,我不明白这种方法的真正作用以及它与我的规范不同的原因。

Devisewarden 上定义了多个钩子,它们通过 _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