Почему authenticate_with_http_token не работает? - PullRequest
1 голос
/ 20 января 2020

У меня есть пользовательский контроллер, который выглядит следующим образом:

class Api::V1::UsersController < ApiController
  include ActionController::HttpAuthentication::Token::ControllerMethods
  before_action :find_user, only: [:show]
  before_action :authenticate, only: [:destroy]

  ...

  def destroy
    if @user
      @user.destroy
    else
      render json: { user: "not found" }, status: :not_found
    end
  end

  private

    ...  

    def authenticate
      authenticate_with_http_token do |token, options|
        @user = User.find_by(token: token)
      end
    end
end

И у меня также есть этот тест

describe "DELETE #destroy" do
    before(:each) do
      @user = FactoryBot.create :user
      request.env['HTTP_AUTHORIZATION'] = @user.token
      delete :destroy, params: { id: @user.id }
    end

    it { should respond_with 204 }
  end

Каждый раз, когда я запускаю bundle exec rspec этот точный тест метода уничтожения сбой: enter image description here Это происходит из-за метода authenticate_with_http_token. Я передаю токен в заголовок HTTP_AUTHORIZATION, но метод authenticate_with_http_token не видит этот токен. Я изменил метод authenticate в контроллере так:

def authenticate
  @user = User.find_by(token: request.headers['HTTP_AUTHORIZATION'])
end

И тест проходит нормально, все работает. Но я не думаю, что явное извлечение токена из request.headers является правильным подходом, и я хотел бы придерживаться authenticate_with_http_token. Что мне делать, чтобы authenticate_with_http_token заработал нормально?

...