Подтвердить что ты не робот

Как использовать драгоценные камни Devise и Doorkeeper?

Я создаю веб-приложение (с помощью API тоже), использующее драгоценный камень Devise для аутентификации, и я также использую драгоценный камень Doorkeeper для аутентификации для части API.

Проблема в том, что когда я перехожу к URL-адресу для получения кода Oauth2 (и входа в систему), я перенаправляюсь к веб-приложению, а не к URL-адресу обратного вызова клиента.

Что мне нужно сделать, так это перенаправление на веб-приложение при обычной регистрации и обратном вызове при использовании Oauth.

Как я могу это сделать? Я перезаписываю контроллер сессий Devise, но я не знаю, что ему в него поделать.

Это мой код:

def new
    session[:return_to] = params[:return_to] if params[:return_to]
    resource = build_resource
    clean_up_passwords(resource)
  end

  def create
    resource = warden.authenticate!(auth_options)
    sign_in(resource_name, resource)
    if session[:return_to]
      redirect_to session[:return_to]
      session[:return_to] = nil
    else
      respond_with resource, :location => after_sign_in_path_for(resource)
    end
  end

Проблема заключается в том, что Devise, похоже, игнорирует мою логику перенаправления.

Проконсультируйтесь с нами.

4b9b3361

Ответ 1

Предполагая, что ваш ресурс user добавить session[:user_return_to] = request.fullpath в блок resource_owner_authenticator

Пример:

resource_owner_authenticator do
  #raise "Please configure doorkeeper resource_owner_authenticator block located in #{__FILE__}"
  # Put your resource owner authentication logic here.
  # Example implementation:
  session[:user_return_to] = request.fullpath
  current_user || redirect_to(login_url)
end

Ответ 2

Это сработало для меня, в ApplicationController (который наследует контроллеры Devise):

def store_location
  # store last url as long as it isn't a /users path
  session[:previous_url] = request.fullpath unless request.fullpath =~ /\/users/
end

def after_sign_in_path_for(_resource)
  session[:previous_url] || root_path
end

И в инициализаторе Doorkeeper:

resource_owner_authenticator do
  if user_signed_in?
    current_user
  else
    session[:previous_url] = request.fullpath unless request.fullpath =~ /\/users/
    redirect_to(new_user_session_path)
  end

конец

Идея состоит в том, чтобы запомнить путь, из которого вы пришли в cookie сессии, а затем разрешить Devise перенаправлять туда, когда он вызывает свой собственный обратный вызов after_sign_in_path_for.

Документация указала клавишу сеанса resource_return_to, но это сработало для меня, поэтому я больше не изучал.