Цепочка фильтров остановлена ​​как :doorkeeper_authorize! визуализировано или перенаправлено

Я создаю API Rails и в настоящее время использую привратник и разработку для аутентификации пользователей с помощью потока ResourceOwnerFromCredentials. Все работает нормально, однако я не могу заставить работать аутентификацию в Rspec.

Вот как я интегрирую приложение в rspec:

    let(:app_country) { FactoryGirl.create(:app_country)}
    let(:valid_attributes) { FactoryGirl.attributes_for(:app_city, {:app_country_id => app_country.id}) }
    let(:valid_session) { {:format => :json} }

    let(:application) { Doorkeeper::Application.create!(:name => "App HQ dashboard", :redirect_uri => "https://localhost:3000/callback") }
    let(:hq_user) { app_country.hq_users.create!(FactoryGirl.attributes_for :hq_user) }
    let(:token) { Doorkeeper::AccessToken.create! :application_id => application.id, :resource_owner_id => hq_user.id }

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

Filter chain halted as :doorkeeper_authorize! rendered or redirected
Completed 403 Forbidden in 5ms (ActiveRecord: 1.2ms)

Это отлично работало с предыдущей версией привратника. Тесты сломались, когда я обновил камень привратника. Что я делаю не так? Или есть новый способ тестирования контроллеров, защищенных привратником?

ОБНОВЛЕНИЕ
Ниже приведен фактический тестовый образец.

    describe "POST create" do
        describe "with valid params" do
            it "creates a new AppCity" do
                expect {
                    post :create, {:app_city => valid_attributes, :v => "HEAD", :payload_type => "NODE", :access_token => token.token}, valid_session
                }.to change(AppCity, :count).by(1)
            end

            it "persists the AppCity" do
                post :create, {:app_city => valid_attributes, :v => "HEAD", :access_token => token.token}, valid_session
                response_body = JSON.parse(response.body, symbolize_names: true)
                expect(response_body[:id]).to be_present
            end

            it "returns a 201 status" do
                post :create, {:app_city => valid_attributes, :v => "HEAD", :access_token => token.token}, valid_session
                response.status.should eq(201)
            end
        end

        describe "with invalid params" do
            it "returns validation error message" do
                post :create, {:app_city => { "name" => "" }, :v => "HEAD", :access_token => token.token}, valid_session
                response_body = JSON.parse(response.body, symbolize_names: true)
                expect(response_body[:name]).to include "can't be blank"
            end

            it "returns a 422 status" do
                post :create, {:app_city => { "name" => "" }, :v => "HEAD", :access_token => token.token}, valid_session
                response.status.should eq(422)
            end
        end
    end

person awsmketchup    schedule 03.08.2015    source источник
comment
Разве вам не нужно также применять созданный токен? Как-то указать это в запросе? Можете ли вы предоставить более полный тест, как с настройкой, так и с фактическим тестом и полезной нагрузкой?   -  person ekampp    schedule 04.08.2015
comment
@EmilKampp Я отредактировал вопрос, включив в него фактический тест.   -  person awsmketchup    schedule 04.08.2015


Ответы (1)


Я наконец нашел проблему. Я получал 403 Forbidden, потому что отправлял запрос с недостаточной областью действия. Я определил следующие области видимости в doorkeeper.rb.

# Define access token scopes for your provider
# For more information go to https://github.com/applicake/doorkeeper/wiki/Using-Scopes
default_scopes  :public
optional_scopes :write, :update

Чтобы мои спецификации снова прошли, мне пришлось указать, какие действия требуют определенной области маркера доступа, например:

class Api::V1::ProductsController < Api::V1::ApiController
  before_action -> { doorkeeper_authorize! :public }, only: :index
  before_action only: [:create, :update, :destroy] do
    doorkeeper_authorize! :admin, :write
  end
end

У меня изначально было только before_action :doorkeeper_authorize!, except: [:index, :show]. Мне нужно было определить области действия :write и :update для действий :create, :update и :destroy. Или, наоборот, полностью отказаться от прицелов.

Я также использую CanCanCan, поэтому я думаю, что в моем случае области действия должны быть избыточными.

Дополнительная информация здесь

person awsmketchup    schedule 05.08.2015