Как заставить Devise и JWT работать с моим версионным API-контроллером Rails? - PullRequest
2 голосов
/ 27 мая 2019

У меня есть API рельсов, использующий Devise. Когда вы нажимаете конечную точку POST / login, он регистрирует пользователя и предоставляет JWT. Это все работало нормально, пока я недавно не перешел на пространство имен своих контроллеров с версией. Вот как выглядит мой метод сессий # 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: 'john@gmail.com',
        password: 'password'
    }
}

Раньше это работало, но теперь, когда я мигрировал в пространство имен Api :: V1 для моего контроллера сессий, он требует, чтобы клиентский интерфейс отправлял учетные данные в: api_v1_user вместо: user.

Есть ли способ, которым я могу изменить свои сеансы # создать функцию для просмотра атрибута: user, а не: api_v1_user?

UPDATE

  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'
       }

1 Ответ

0 голосов
/ 30 мая 2019

Хорошо, я понял это. Это кажется хакерским, но это работает. Вот что я изменил мой метод создания 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
...