У меня есть API рельсов, использующий Devise. Когда вы нажимаете на конечную точку POST/login, пользователь входит в систему и предоставляет JWT. Все это работало нормально, пока я недавно не переместил свои контроллеры в пространство имен с версией. Вот как выглядит мой метод session#create:
def create
self.resource = warden.authenticate!(auth_options)
set_flash_message!(:notice, :signed_in)
sign_in(resource_name, resource)
yield resource if block_given?
render json: current_user
end
При выполнении запроса на вход из внешнего интерфейса мои параметры выглядят следующим образом:
{
user: {
email: '[email protected]',
password: 'password'
}
}
Раньше это работало, но теперь, когда я перешел на пространство имен Api::V1 для своего контроллера сеансов, он требует, чтобы внешний интерфейс отправлял учетные данные под :api_v1_user вместо :user.
Есть ли способ изменить функцию session#create, чтобы она смотрела на атрибут :user, а не на :api_v1_user?
ОБНОВИТЬ
namespace :api do
namespace :v1 do
devise_for :users,
path: '',
path_names: {
sign_in: 'login',
sign_out: 'logout',
registration: 'signup'
},
controllers: {
sessions: 'api/v1/sessions',
registrations: 'api/v1/registrations'
}
Обновил сообщение
Хорошо, я понял это. Это кажется хакерским, но это работает. Вот что я изменил в своем методе создания Api::V1::SessionsController на:
def create
# Changing scope from :api_v1_user to :user
Devise.mappings[:user] = Devise.mappings[:api_v1_user]
warden.config[:default_strategies][:user] = warden.config[:default_strategies].delete(:api_v1_user)
auth_opts = auth_options
auth_opts[:scope] = :user
self.resource = warden.authenticate!(auth_opts)
set_flash_message!(:notice, :signed_in)
sign_in(resource_name, resource)
yield resource if block_given?
render json: current_api_v1_user
end
можешь поделиться маршрутами?