19

ユーザー認証としてdeviseを使用している既存のRailsアプリがあります。談話フォーラムを追加しましたが、すべてがスムーズに進み、サブドメインに常駐しています. https://meta.discourse.org/t/official-single-sign-on-for-discourse/13045の投稿を読みましたが、ユーザーがログに記録した後、デバイス側で何をすべきかまだわかりません既存のレールサイトに。現在、これは私が理解しているプロセスです。

ステップ 1: ユーザーがサブドメインの Discourse フォーラムにアクセスします。ユーザーはログインする必要があるため、ログイン ボタンをクリックします。

ステップ 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に含まれているかどうかを解析がチェックし、そうであれば、デバイスのログインプロセスが完了するとリダイレクトされ、そうでない場合は通常どおり機能すると思います。このコードをデバイスファイルのどこかに配置しますか?

4

1 に答える 1

37

これは非常に簡単です。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) 談話にログインしてみてください。それはうまくいくはずです...

于 2015-01-28T11:57:15.650 に答える