将Discourse SSO与现有的Rails站点与Devise结合起来

我有一个现有的rails应用程序,它使用设计作为用户身份validation。 我添加了一个话语论坛 ,一切顺利,它位于一个子域。 我已经在https://meta.discourse.org/t/official-single-sign-on-for-discourse/13045阅读了这篇文章,但是一旦用户登录,我仍然不知道如何处理设计方面的问题在现有的铁路网站上。 目前这是我理解的过程:

第1步:用户点击子域上的话语论坛。 用户需要登录才能点击登录按钮。

步骤2:将用户发送到现有rails站点的登录页面。

步骤3:用户登录rails站点。

Step4:用户应该被重定向到登录的话语论坛子域。

我的问题是 – 我需要做些什么来使用户在登录第3步时将其重定向回子域? 有没有人成功实现过这个? 我在该演练页面上看到了这段代码:

class DiscourseSsoController < ApplicationController def sso secret = "MY_SECRET_STRING" sso = SingleSignOn.parse(request.query_string, secret) sso.email = "user@email.com" sso.name = "Bill Hicks" sso.username = "bill@hicks.com" 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中,如果是,它一旦完成设计登录过程就重定向,如果不是,它就像往常一样。 我会将此代码放在设计文件中的某个位置吗?

这非常简单。 根据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)将此控制器放在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)尝试登录话语。 它应该工作......