DiscourseSsoController#sso에서 ArgumentError 오류, 인자 개수 오류 (1개 전달, 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 이 가져오기에 영향을 미쳤을 수 있습니다.

이 클래스는 제 애플리케이션에 포함되어 있으며, SSO를 관리하기 위해 Setup DiscourseConnect - Official Single-Sign-On for 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 버전도 확인해 주시겠어요?

네, 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! # 사용자가 로그인해야 함을 보장

음, 저도 방금 이 문제를 겪었습니다.
참고 구현체(reference implementation)는 빈 해시 참조로 객체를 인스턴스화하는 기능을 사용하고 있는데, 이 기능은 Ruby 2.7 이상에서만 동작합니다.

args = {}
class A; end
A.new(**args) #=> ruby >= 2.7일 때만 동작

Ruby 2.7 이상에서도 #parse를 호출할 때 해시를 전달하면 lib/single_sign_on.rb:65에서 sso = new(**init_kwargs)를 호출하고, DiscourseSingleSignOn이 SingleSignOn을 상속하고 있음에도 불구하고 #initialize(secure_session:)가 app/models/discourse_single_sign_on.rb:28에 정의되어 있어 참조 코드(lib/single_sign_on.rb)가 오류를 발생시킵니다.

이는 해당 코드를 사용하면서 프로젝트에서 Ruby 2.7 미만을 사용하거나 일부 kwargs를 전달하는 사람들에게 도움이 되지 않습니다.
따라서 최소한 SingleSignOn이 def initialize(**kwargs);end를 구현해야 한다고 생각합니다.

@david 링크가 깨져 있습니다 single_sign_on.rb

영구 링크(permalink)로 업데이트했습니다. 현대적인 대응 파일은 discourse_connect_base.rb입니다.

감사합니다! 그런데 SSO로 로그인한 후 내 사용자를 관리자로 설정하는 방법은 무엇인가요?

지금까지 시도한 내용과 그 결과를 포함하여 #support에 새로운 주제를 개설해 주세요.