Разработка API sign_in не работает с почтальоном - PullRequest
1 голос
/ 14 января 2020

Я использую Rails 6 в режиме API и последнюю версию devise.

Я создал rspe c тест для sign_in и sign_up, и он работает правильно, они принимают json ответ и отвечают в json

Когда я пытаюсь протестировать мой API с почтальоном, он работает для sign_up, но не для sign_in.

С почтальоном я получаю следующее возвращение

{
    "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

Он работает хорошо.

Я ожидал найти решение я сам копаю драгоценный камень и сравниваю свои результаты с моим spe c, но я, честно говоря, не понимаю, что на самом деле делают эти методы и почему это отличается от моего spe c.

1 Ответ

1 голос
/ 22 января 2020

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...