Setup DiscourseConnect - Official Single-Sign-On for Discourse (sso) のガイドに従って、既存の RoR アプリケーションとのログイン共有のために Discourse SSO を有効にしましたが、ウェブサイトへリダイレクトされログイン後に「Error ArgumentError in DiscourseSsoController#sso, wrong number of arguments (given 1, expected 0)」というエラーが表示されます。
スクリーンショットを見ると、そのエラーは Discourse ではなく、カスタム Rails アプリから発生しているように見えますが、合っていますか?Discourse には DiscourseSsoController#sso メソッドはないと思いますし、バックトレースも Discourse のものには見えません。
そのメソッドは Rails アプリでどのように実装されていますか?Discourse のコードベースから一部のコードをインポートしましたか?もしそうなら、この変更がインポートに影響している可能性があります: SECURITY: Attach DiscourseConnect (SSO) nonce to current session (#12… · discourse/discourse@13d2a1f · GitHub
このクラスは私のアプリケーション内にありますが、SSOを管理するために私のアプリケーションに配置した公式のコードです(参照:https://meta.discourse.org/t/discourseconnect-official-single-sign-on-for-discourse-sso/13045)。
また、既存のRailsサイトとDeviseを使用してDiscourse SSOを統合する方法については、https://stackoverflow.com/questions/25478510/incorporating-discourse-sso-with-existing-rails-site-with-devise も参照しました。
なるほど、single_sign_on.rb の内容をコピーされたのですね。ここはドキュメントの更新が必要かもしれません。single_sign_on.rb ファイル内の SingleSignOn クラスに新しい関数を追加してみてください。
def initialize(**kwargs)
end
これで表示されているエラーが解消されると思います。
また、使用している Ruby のバージョンを教えていただけますか?
サーバーを再起動しましたか?end 行でエラーが発生する理由が思いつかないので、実行中のコードとファイルシステム上のコードが一致していないのではないかと疑っています。
それが問題の一部かもしれません。Discourse のコードはすべて 2.7 以上向けに書かれています。
失礼しました、私の不手際でした。サーバーを再起動していなかったため、変更がイニシャライザーにあることに気づきませんでした。
Devise と CanCanCan を併用する場合は、以下の対応も必要でした:before_action をコメントアウトし、skip_authorization_check を追加します。
class DiscourseSsoController < ApplicationController
skip_authorization_check
# before_action :authenticate_user! # ユーザーのログインを必須にする
はい、私もまさにこれに遭遇しました。
参照実装では、空のハッシュ参照でオブジェクトをインスタンス化するという、Ruby 2.7 以降で動作する機能を使用しているようです。
args = {}
class A; end
A.new(**args) # Ruby >= 2.7 の場合のみ動作
Ruby 2.7 以降であっても、#parse を呼び出す際にハッシュを渡そうとすると、参照コード(lib/single_sign_on.rb)はエラーを発生させます。これは、lib/single_sign_on.rb:65 で sso = new(**init_kwargs) が呼ばれ、#initialize(secure_session:) が app/models/discourse_single_sign_on.rb:28 で定義されているためです。ただし、DiscourseSingleSignOn は SingleSignOn から継承しています。
このままでは、Ruby 2.7 未満のプロジェクトを使用している人々や、何らかのキーワード引数を渡す人々には役立ちません。
したがって、少なくとも SingleSignOn クラスに def initialize(**kwargs); end を実装すべきだと考えます。
@david リンクが壊れています single_sign_on.rb
パーマリンクに更新しました。最新の相当するものは discourse_connect_base.rb です。
ありがとうございます。しかし、SSOでサインインした後、ユーザーを管理者として設定するにはどうすればよいですか?
これまでに試したことと、その結果について、新しい Support トピックを開いてください。

