ruby-on-rails – 将Discourse SSO与现有的Rails网站结合起来

前端之家收集整理的这篇文章主要介绍了ruby-on-rails – 将Discourse SSO与现有的Rails网站结合起来前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个现有的rails应用程序正在使用devise作为用户身份验证.我添加了一个 discourse forum,一切顺利,它位于一个子域.我已经在 https://meta.discourse.org/t/official-single-sign-on-for-discourse/13045阅读了这篇文章,但是一旦用户登录到现有的网站上,仍然不知道该怎么处理这些事情.目前这是我所理解的过程:

Step1:用户点击子域上的话语论坛.用户需要登录才能点击登录按钮.

步骤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,如果是这样,它会重定向一旦完成设计登录过程,如果不是它只是像往常一样的功能.我会把这个代码放在devise文件的某个地方吗?

解决方法

这很简单从 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)尝试登录话语.应该工作…

猜你在找的Ruby相关文章