我有一个使用设备的现有rails应用程序,因为它是用户身份验证。我添加了discourse forum,一切顺利,它位于子域。我已经在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 = "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中,如果是,它一旦完成设计登录过程就重定向,如果不是,它就像往常一样。我会将此代码放在设计文件中的某个位置吗?
答案 0 :(得分:34)
这非常简单。继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)尝试登录话语。它应该工作......