公式の実装手順 (こちら) と Stackoverflow に関するこの回答(こちら) に従って、談話用の SSO をインストールしました。しかし、それは機能していません。SSO ペイロードは、Get users/sign_in アクションと Post users/sign_in アクションの間にドロップされます。
Heroku のログは次のとおりです。
Started GET "/users/sign_in?sso=PAYLOAD & SIG [GET]
Processing by Users::SessionsController#new as HTML [NEW ACTION]
Parameters: {"sso"=> etc. [SSO PAYLOAD PRESENT]
- rendering html -
heroku[router]: at=info method=GET path="/users/sign_in?sso= [PAYLOAD PRESENT]
Processing by Users::SessionsController#create as HTML [CREATE ACTION]
Parameters: {"utf8"=>"✓", "authenticity_token"=> etc [NO SSO PAYLOAD,
Google Recaptcha added]
Started GET "/"
Started POST "/users/sign_in"
Processing by StaticPagesController#home as HTML
- rendering html -
heroku[router]: at=info method=POST path="/users/sign_in" host=our_site.com
公式の指示 (上記) による談話 SSO コントローラーは次のとおりです。
class DiscourseSsoController < ApplicationController
def sso
secret = "SECRET STRING"
sso = SingleSignOn.parse(request.query_string, secret)
sso.email = current_user.email # from devise
sso.name = current_user.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://DISCOURSE_sub-domain_of.OUR_SITE.com/
session/sso_login")
end
end
Devise ビューをカスタマイズし、スコープ ユーザー (クラス Users::SessionsController < Devise::SessionsController) を使用して Devise セッション コントローラーをインストールしました。
Githubの Devise Sessions Controllerソース コードを見ると、Get / New および Post / Create メソッドは次のとおりです。
GET /resource/sign_in
def new
self.resource = resource_class.new(sign_in_params)
clean_up_passwords(resource)
yield resource if block_given?
respond_with(resource, serialize_options(resource))
end
POST /resource/sign_in
def create
self.resource = warden.authenticate!(auth_options)
set_flash_message(:notice, :signed_in) if is_flashing_format?
sign_in(resource_name, resource)
yield resource if block_given?
respond_with resource, location: after_sign_in_path_for(resource)
end
Create メソッドの最初の行は、New メソッドの最後の行を参照しますauth_options
(これは ですprotected
):
def auth_options
{ scope: resource_name, recall: "#{controller_path}#new" }
end
New メソッドの最後の行 (私は信じています) は、投稿されるパラメーターを作成します。それらはserialize_options(resource)
、別のprotected
方法です:
def serialize_options(resource)
methods = resource_class.authentication_keys.dup
methods = methods.keys if methods.is_a?(Hash)
methods << :password if resource.respond_to?(:password)
{ methods: methods, only: [:password] }
end
SSO ペイロードが として渡されていませんserialize_options
。
これは、deviseと oauth OmniAuth Single Sign On with Devise の同様の問題であると思われるもので、invalid_credentialsはトークンをスクレイピングすることで解決されます。
ガイダンスや考えをいただければ幸いです。ありがとう。