Включение единого входа в систему Discovery с существующим сайтом Rails с дизайном

У меня есть существующее приложение rails, которое использует devess как аутентификацию пользователя. Я добавил форум дискурса, и все прошло гладко и оно находится на субдомене. Я прочитал сообщение на https://meta.discourse.org/t/official-single-sign-on-for-discourse/13045, но до сих пор не знаю, что делать с созданной стороной вещей, когда пользователь входит в систему на существующем сайте rails. В настоящее время это процесс, насколько я понимаю:

Шаг 1: Пользователь нажимает на форум дискурса на субдомене. Пользователь должен войти в систему, нажав кнопку входа в систему.

Шаг 2: Пользователь отправляется на страницу входа на существующий сайт rails.

Шаг 3: Пользователь регистрируется на сайте rails.

Шаг 4: Пользователь должен быть перенаправлен на субдомен форума обсуждения, зарегистрированный.

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

  class DiscourseSsoController < ApplicationController
  def sso
    secret = "MY_SECRET_STRING"
    sso = SingleSignOn.parse(request.query_string, secret)
    sso.email = "[email protected]"
    sso.name = "Bill Hicks"
    sso.username = "[email protected]"
    sso.external_id = "123" # unique to your application
    sso.sso_secret = secret

    redirect_to sso.to_url("http://l.discourse/session/sso_login")
  end
end

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

Ответы

Ответ 1

Это довольно просто. Следуя инструкциям на https://meta.discourse.org/t/official-single-sign-on-for-discourse/13045 и немного экстраполируя, у меня есть эта работа:

1) Поместите эталонную реализацию - https://github.com/discourse/discourse/blob/master/lib/single_sign_on.rb - в каталог # {Rails.root}/lib

2) Добавьте этот маршрут в route.rb

get 'discourse/sso' => 'discourse_sso#sso'

3) Поместите этот контроллер в каталог приложений/контроллеров

require 'single_sign_on'

class DiscourseSsoController < ApplicationController
  before_action :authenticate_user! # ensures user must login

  def sso
    secret = "MY_SECRET_STRING"
    sso = SingleSignOn.parse(request.query_string, secret)
    sso.email = current_user.email # from devise
    sso.name = current_user.full_name # this is a custom method on the User class
    sso.username = current_user.email # from devise
    sso.external_id = current_user.id # from devise
    sso.sso_secret = secret

    redirect_to sso.to_url("http://your_discource_server/session/sso_login")
  end
end

4) Настройте конфигурацию SSO в дискурсе, чтобы иметь следующие

sso url: http://your_rails_server/discourse/sso
sso secret : what you set as MY_SECRET_STRING above

5) Отключите другие типы входа в дискурсе.

6) Попробуйте войти в дискурс. Он должен работать...