【问题标题】:Incorporating Discourse SSO with Existing Rails Site with Devise将 Discourse SSO 与现有 Rails 站点与 Devise 相结合
【发布时间】:2014-10-18 04:00:09
【问题描述】:

我有一个现有的 Rails 应用程序,它使用设计作为用户身份验证。我添加了一个discourse forum,一切都很顺利,它位于一个子域中。我已经阅读了https://meta.discourse.org/t/official-single-sign-on-for-discourse/13045 的帖子,但是一旦用户登录现有的 Rails 站点,我仍然不知道如何处理设计方面的事情。目前这是我理解的过程:

Step1:用户在子域上点击 Discourse 论坛。用户需要登录,所以点击登录按钮。

Step2:将用户发送到现有 Rails 站点上的登录页面。

Step3:用户在rails 网站上登录。

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

我的问题是 - 我需要做什么才能使用户在第 3 步登录时被重定向回子域?有没有人成功地实现了这一点?我在那个演练页面上看到了这段代码 sn-p:

  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 中,如果是,它会在完成设计登录过程后重定向,如果不是,它只会像往常一样运行。我会将此代码放在设计文件中的某个位置吗?

【问题讨论】:

  • 你有想过这个吗?
  • 您的问题有更新吗?

标签: ruby-on-rails devise discourse


【解决方案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) 将此路由添加到 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) 在 discourse 中设置 SSO 配置以具有以下内容

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

5) 禁用话语中的其他登录类型。

6) 尝试登录话语。它应该工作......

【讨论】:

  • 我认为应该是before_filter而不是控制器中的before_action
  • 在 Rails 4 中,习惯使用 before_action stackoverflow.com/questions/16519828/…
  • request.query_string 将为零,它来自哪里?你能帮我知道为什么会这样吗?我已关注您的回复。
  • @DanSingerman 我们应该在现有的 Rails 应用程序上点击的第一条路线是什么,我目前正在点击,localhost:3000/discourse/sso 但在生成有效负载时出错
  • @kamal 你应该在尝试签署话语后点击它(还有一堆加密的 URL 参数)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-23
  • 1970-01-01
相关资源
最近更新 更多