Grape - проблема аутентификации в конечной точке API - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть базовый класс API, который определяет мой API и монтирует мои конечные точки.

module API
  class Core < Grape::API
    prefix :api
    include ErrorHandlers
    helpers AuthHelpers
    default_format :json
    content_type :json, 'application/json'
    formatter :json, Grape::Formatter::JSONAPIResources

    mount ::Trips::Base
    mount ::Statistics::Base
    mount ::Users::Base
  end
end

AuthHelpers модуль предоставляет мне глобальный вспомогательный метод для аутентификации в конечных точках, где мне нужно аутентифицировать пользователей.

module AuthHelpers
  extend Grape::API::Helpers

  def authenticate_user!
    begin
      payload = JsonWebToken.decode(token)
      @current_user = User.find_by(id: payload['user_id'])
    rescue
      error!(I18n.t('authorization.unauthenticated'), 401)
    end
  end

  def current_user
    @current_user ||= authenticate_user!
  end

  def token
    request.headers['Authorization'].split(' ').last
  end
end

Я использую его во всех конечных точках , кроме UsersAPI, потому что, очевидно, я не хочу аутентифицировать пользователя, когда он / она регистрируется или входит в систему. Вот как я используюэто пример базового класса конечной точки:

app / api / statistics / base.rb

module Statistics
  class Base < API::Core
    resources :stats do
      before { authenticate_user! }
      mount StatisticsAPI
    end
  end
end

Так что в before блоке я звоню authenticate_user!.

СейчасЯ установил gem 'grape-jsonapi-resources' и добавил formatter :json, Grape::Formatter::JSONAPIResources в свой базовый класс API (согласно их документам), поскольку я хочу вернуть симпатичный JSON в ответ глобально, и с тех пор у меня начались проблемы с конечной точкой UsersAPI, где внезапновсе запросы не выполняются из-за ошибки Unauthorized 401.Вот мой UsersAPI базовый класс.

module Users
  class Base < API::Core
    resources :users do
      mount UsersAPI
    end
  end
end

Здесь я не использую authenticate_user! по причинам, которые я объяснил ранее, и я пытаюсь понять, как, после добавления formatter :json, Grape::Formatter::JSONAPIResources к базовому классу APIпытается аутентифицировать пользователя.Что я делаю неправильно?Почему я получаю Unauthorized 401 в конечной точке, где я даже не вызываю authenticate_user! метод.Вы можете мне помочь?

ОБНОВЛЕНИЕ

Я попытался переименовать authenticate_user! вспомогательный метод в authenticate!, и я получил ошибку caught error of type NoMethodError in after callback inside Grape::Middleware::Formatter : undefined method authenticate_user!' for #<#<Class:0x000055de6bf3e798>:0x000055de6a8d08a8> Did you mean? authenticate!, что интересно.Я удивляюсь, почему средство форматирования вызывает метод authenticate_user!.

...