DiscourseSsoController#sso で ArgumentError: wrong number of arguments (given 1, expected 0)

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

「いいね!」 1

このクラスは私のアプリケーション内にありますが、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 のバージョンを教えていただけますか?

「いいね!」 1

はい、single_sign_on.rb の内容をコピーしました。

Ruby 2.4.6 を使用しています。

initialize を追加した後、エラーが変更されました。

サーバーを再起動しましたか?end 行でエラーが発生する理由が思いつかないので、実行中のコードとファイルシステム上のコードが一致していないのではないかと疑っています。

それが問題の一部かもしれません。Discourse のコードはすべて 2.7 以上向けに書かれています。

失礼しました、私の不手際でした。サーバーを再起動していなかったため、変更がイニシャライザーにあることに気づきませんでした。

Devise と CanCanCan を併用する場合は、以下の対応も必要でした:before_action をコメントアウトし、skip_authorization_check を追加します。

class DiscourseSsoController < ApplicationController
   skip_authorization_check
   # before_action :authenticate_user! # ユーザーのログインを必須にする
「いいね!」 1

はい、私もまさにこれに遭遇しました。
参照実装では、空のハッシュ参照でオブジェクトをインスタンス化するという、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 で定義されているためです。ただし、DiscourseSingleSignOnSingleSignOn から継承しています。

このままでは、Ruby 2.7 未満のプロジェクトを使用している人々や、何らかのキーワード引数を渡す人々には役立ちません。
したがって、少なくとも SingleSignOn クラスに def initialize(**kwargs); end を実装すべきだと考えます。

@david リンクが壊れています single_sign_on.rb

パーマリンクに更新しました。最新の相当するものは discourse_connect_base.rb です。

「いいね!」 1

ありがとうございます。しかし、SSOでサインインした後、ユーザーを管理者として設定するにはどうすればよいですか?

これまでに試したことと、その結果について、新しい Support トピックを開いてください。

「いいね!」 2