Можно ли выполнить вход, выход и т. Д. c без какого-либо перенаправления? - PullRequest
0 голосов
/ 11 марта 2020

Я использую Devise, но не использую контроллеры Devise напрямую, потому что я выполняю все действия через специальный API GraphQL. Например, у меня есть одна проблема: после включения confirmable, если пользователь пытается войти в систему и я звоню Devise::Controllers::Helpers#sign_in, пользователь перенаправляется на /api/v1/users/sign_in, который не существует, и это будет неправильно, даже если это существует. Вместо этого мне нужно, чтобы ошибка входа не возвращалась обратно в мой код (возвращаемое значение, исключение и т. Д.), Чтобы мой API мог кодировать этот ответ во внешнем интерфейсе.

Как я могу это сделать?

Например, это моя функция входа в систему:

def resolve(email:, password:)
  user = User.find_for_authentication(email: email)
  if user&.valid_password?(password)
    context[:sign_in].call(user)
    { current_user: user }
  else
    { errors: [{ message: 'Email or password incorrect.' }] }
  end
end

context[:sign_in] устанавливается в GraphqlController путем включения Devise::Controllers::Helpers, а затем просто:

context = {
  current_user: current_user,
  sign_in: method(:sign_in),
  sign_out: method(:sign_out)
}

Примечание: я не использую GraphqlDevise , потому что я не хочу использовать Разработать авторизацию токена , я использую куки.

1 Ответ

0 голосов
/ 11 марта 2020

Я полагаю, что передача методов sign_in / sign_out devise через контекст, вероятно, затухает.

Предложение в комментарии к вашему вопросу от @ Int'l Man Of Coding Mystery хорошо ie, вы можете использовать: https://github.com/graphql-devise/graphql_devise.

Если вы не заинтересованы во введении другой зависимости и выяснении, как связать все, что вы можете, возможно, go с переопределенным SessionController устройства. Вот несколько примеров здесь: Rails - Как переопределить devise SessionsController для выполнения определенных c задач, когда пользователь входит в систему? (но также не стесняйтесь смотреть на исходный код соответствующей версии Devise: https://github.com/heartcombo/devise/blob/master/app/controllers/devise/sessions_controller.rb)

В зависимости от вашего варианта использования вы можете даже сделать то, что вам нужно, используя некоторые параметры конфигурации - например, вы можете попытаться переопределить after_sign_in_path et c.

...