Доступ к информации приложения Doorkeeper перед перенаправлением входа - PullRequest
0 голосов
/ 25 января 2019

Объяснение

Я хочу остановить процесс авторизации клиентского приложения (под управлением OAuth2), приходящего в родительское приложение (под управлением Doorkeeper), чтобы узнать, какое клиентское приложение запрашиваетлогин.Таким образом, я могу найти clientID и динамически создать собственный экран входа в систему для клиентского приложения.Прямо сейчас мой клиент переходит к родителю, вызывается AuthorizationController, но перед вызовом new и я могу получить params[:client_id], authenticate_resource_owner! вызывается с before_action.Затем он отправляет пользователя на страницу входа, если он еще не вошел с родителем.Итак, прежде чем я смогу получить параметр, он перенаправляется.

Вопрос

authenticate_resource_owner! хранится в файле помощника Doorkeeper.Я думал, что настроил его правильно, чтобы обойти помощника по умолчанию и перейти к моему, где я могу попытаться получить параметр и сохранить в сеансах до перенаправления, но я предполагаю, что мой маршрут не настроен правильно, и я не могу найти какой-либодокументация о том, как правильно это назвать.Кто-нибудь может помочь?

Код

Код для настройки клиента:

def setup_client
    @client = Application.find_by(uid: params[:client_id])
    session[:client_name] = @client.name
    authenticate_resource_owner!
end

Я знаю, что первые две строки работают так, как я их поместил в CustomAuthorizationsController с byebug, и он сработал после входа в систему и перед перенаправлением обратно к клиенту и показал имя клиента, сохраненное в переменной сеанса.

В моем config/routes.rb

  use_doorkeeper do
    controllers :applications   => 'doorkeeper/custom_applications'
    controllers :authorizations => 'doorkeeper/custom_authorizations'
    helpers     :doorkeeper     => 'doorkeeper/doorkeeper'
  end

Файл помощника находится в app/helpers/doorkeeper/doorkeeper_helper.rb

Ошибка

При запускена моем сервере я получаю:

: from ~/ruby-2.5.0/gems/doorkeeper-5.0.2/lib/doorkeeper/rails/routes/mapper.rb:12:in `instance_eval'
~/settingsParentApp/config/routes.rb:65:in `block (2 levels) in <top (required)>': undefined method `helpers' for #<Doorkeeper::Rails::Routes::Mapper:0x00007ffd539b9c10> (NoMethodError)

Заключение

Я даже делаю это правильно?Есть ли более простой способ, встроенный в Doorkeeper, который я не вижу, чтобы получить эту информацию для настройки экрана входа?Или есть какая-то ошибка, которую я не вижу в том, как я вызываю вспомогательный файл?

1 Ответ

0 голосов
/ 25 января 2019

Обдумав мою проблему, чтобы задать этот вопрос, меня осенило решение. Я проверил это, и это сработало. Я забыл, что в контроллере операторы before_action вызываются в порядке их представления. Итак, мое решение состояло в том, чтобы просто изменить порядок моих заявлений, чтобы сначала вызвать setup_client перед authenticate_resource_owner!. Это установило переменную сеанса перед перенаправлением на экран входа в систему, а затем позволило мне иметь переменную доступной для использования.

Код

В моем config/routes.rb файле:

  use_doorkeeper do
    controllers :applications   => 'doorkeeper/custom_applications'
    controllers :authorizations => 'doorkeeper/custom_authorizations'
  end

Этот пользовательский маршрут обходит контроллер авторизации по умолчанию для привратника и переходит к пользовательскому маршруту, который наследуется от контроллера по умолчанию. Итак, все, что мне нужно в этом пользовательском коде, это код:

Найдено: app/controllers/doorkeeper/custom_authorizations_controller.rb

module Doorkeeper
  class CustomAuthorizationsController < Doorkeeper::AuthorizationsController
    before_action :setup_client
    before_action :authenticate_resource_owner!

    def setup_client
        @client = Application.find_by(uid: params[:client_id])
        session[:client_name] = @client.name
    end

  end
end

Затем этот код запускается до того, как он смотрит на привратника по умолчанию AuthorizationsController и, таким образом, сначала вызывает setup_client. Затем переменная сеанса сохраняется, и на экране входа в систему я могу назвать ее следующим образом:

<% 
  if session[:client_name].nil?
    @client_name = ''
  else
    @client_name = ' for ' + session[:client_name]
  end

  @page_name = "Login" + @client_name
%>

А затем в заголовке страницы я называю это в HTML:

<h1><%= @page_name %></h1>

Позже я могу заняться более причудливыми вещами, такими как сохранение значков / логотипов клиентов и цветовых схем для придания брендингу специфичности на странице входа в систему, но на данный момент эта основная проблема решена. Спасибо вам всем за то, что вы играете роль моей решающей команды и решаете проблемы ... если вы знаете эту ссылку. :-) Удачного кодирования!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...