Включение единого входа Discourse в существующий сайт Rails с помощью Devise

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

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

Шаг 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-адресе, и если да, то он перенаправляется после завершения процесса входа в систему, а если нет, он просто работает как обычно. Могу ли я разместить этот код где-нибудь в файлах разработки?


person cjiro    schedule 25.08.2014    source источник
comment
Вы когда-нибудь догадывались об этом?   -  person Daniel Hollands    schedule 13.01.2015
comment
Есть ли новости по вашей проблеме?   -  person Kenny Meyer    schedule 28.01.2015


Ответы (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) Поместите этот контроллер в каталог app/controllers.

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) Попробуйте войти в дискурс. Он должен работать...

person DanSingerman    schedule 28.01.2015
comment
Я думаю, что это должно быть before_filter вместо before_action в контроллере. - person Kenny Meyer; 30.01.2015
comment
В Rails 4 идиоматично использовать before_action stackoverflow.com/questions/16519828/ - person DanSingerman; 02.02.2015
comment
request.query_string становится равным нулю, откуда он берется? Не могли бы вы помочь мне узнать, почему это так? Я следил за вашим ответом. - person kamal; 05.02.2016
comment
@DanSingerman, каков первый маршрут, который мы должны использовать в нашем существующем приложении rails, в настоящее время я использую localhost:3000/discourse /sso, но возникает ошибка при создании полезной нагрузки - person kamal; 09.02.2016
comment
@kamal, вы должны нажать это после попытки подписаться на дискурс (также с кучей зашифрованных параметров URL) - person DanSingerman; 09.02.2016
comment
Привет всем, не могли бы вы помочь показать немного больше деталей, как заставить это работать в локальной разработке? Как настроить форум sudomain disourse с основным доменом в разработке? Пожалуйста, помогите всем. Спасибо. - person Sinal; 30.04.2016