У меня есть базовый класс 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!
.