2014-08-25 3 views
16

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

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

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

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

Step4: Пользователь должен быть перенаправлен на дискурсу форум подобласть вошли в

Мой вопрос - Что мне нужно сделать, чтобы сделать это так, чтобы, когда пользователь входит в систему на этапе 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 

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

+2

Вы когда-нибудь это выясняли? –

+1

Есть ли какие-либо обновления по вашей проблеме? –

ответ

30

Это довольно просто. Исходя из инструкции по 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) Добавить этот маршрут в routes.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) Установить тыс e SSO config в дискурсе, чтобы иметь следующее:

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

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

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

+0

Я думаю, что это должно быть 'before_filter' вместо' before_action' в контроллере. –

+0

В Rails 4 идиоматично использовать before_action http://stackoverflow.com/questions/16519828/rails-4-before-filter-vs-before-action – DanSingerman

+0

request.query_string идет нуль, откуда он идет? Не могли бы вы помочь мне узнать, почему это так? Я последовал твоему ответу. – kamal