Я использую 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 , потому что я не хочу использовать Разработать авторизацию токена , я использую куки.