Nach der Befolgung der Anleitung Setup DiscourseConnect - Official Single-Sign-On for Discourse (sso) habe ich Discourse SSO aktiviert, um die Anmeldung mit meiner bestehenden RoR-Anwendung zu teilen. Nach der Weiterleitung zu meiner Website und der erfolgreichen Anmeldung erhalte ich jedoch den Fehler „Error ArgumentError in DiscourseSsoController#sso, wrong number of arguments (given 1, expected 0)".
Wenn man den Screenshot betrachtet, scheint dieser Fehler von deiner benutzerdefinierten Rails-App zu stammen und nicht von Discourse. Stimmt das? Ich glaube nicht, dass Discourse eine DiscourseSsoController#sso-Methode hat, und der Backtrace sieht auch nicht nach Discourse aus.
Wie hast du diese Methode in deiner Rails-App implementiert? Hast du Teile des Codes aus der Discourse-Codebasis importiert? Falls ja, könnten deine Imports von dieser Änderung betroffen sein: SECURITY: Attach DiscourseConnect (SSO) nonce to current session (#12… · discourse/discourse@13d2a1f · GitHub
Diese Klasse befindet sich in meiner Anwendung, stammt jedoch aus dem offiziellen Code von Setup DiscourseConnect - Official Single-Sign-On for Discourse (sso), den ich in meine Anwendung integriert habe, um SSO zu verwalten.
Zudem habe ich mich an https://stackoverflow.com/questions/25478510/incorporating-discourse-sso-with-existing-rails-site-with-devise orientiert.
Ich verstehe, Sie haben also den Inhalt von single_sign_on.rb kopiert? Vermutlich müssen wir hier die Dokumentation aktualisieren. Könntest du versuchen, eine neue Funktion innerhalb der SingleSignOn-Klasse in deiner single_sign_on.rb-Datei hinzuzufügen?
def initialize(**kwargs)
end
Ich denke, das sollte den von dir gesehenen Fehler beheben.
Kannst du außerdem bestätigen, welche Ruby-Version du verwendest?
Ja, ich habe den Inhalt von single_sign_on.rb kopiert.
Ich verwende Ruby 2.4.6.
Nach dem Hinzufügen von initialize hat sich der Fehler geändert.
Hast du den Server neu gestartet? Ich kann mir nicht vorstellen, warum ein Fehler auf einer Zeile mit end ausgelöst würde. Ich vermute daher, dass der ausgeführte Code nicht mit dem übereinstimmt, was sich auf dem Dateisystem befindet?
Das könnte durchaus Teil des Problems sein. Der Discourse-Code ist allesamt für 2.7+ geschrieben.
Entschuldigung, mein Fehler. Ich habe den Server nicht neu gestartet, da mir nicht aufgefallen war, dass die Änderung im Initializer lag. Bei Verwendung von Devise mit CanCanCan musste ich zudem Folgendes tun: before_action auskommentieren und skip_authorization_check hinzufügen:
class DiscourseSsoController < ApplicationController
skip_authorization_check
#before_action :authenticate_user! # stellt sicher, dass der Benutzer eingeloggt sein muss
Ok, ich bin gerade selbst darauf gestoßen.
Es scheint, dass die Referenzimplementierung eine Funktion verwendet, die ab Version 2.7 funktioniert: das Instantiieren eines Objekts mit einer learen Hash-Referenz.
args = {}
class A; end
A.new(**args) #=> funktioniert nur, wenn Ruby >= 2.7
Selbst in Ruby >= 2.7 wirft der Referenzcode (lib/single_sign_on.rb) einen Fehler, wenn Sie beim Aufruf von #parse einen Hash übergeben, da in lib/single_sign_on.rb:65 sso = new(**init_kwargs) aufgerufen wird und #initialize(secure_session:) in app/models/discourse_single_sign_on.rb:28 definiert ist, obwohl DiscourseSingleSignOn von SingleSignOn erbt.
Das würde Nutzern dieses Codes nicht helfen, die entweder Ruby < 2.7 in ihrem Projekt verwenden oder einige Keyword-Argumente übergeben.
Also ja, meiner Meinung nach sollte SingleSignOn zumindest def initialize(**kwargs);end implementieren.
@david der Link für ist kaputt single_sign_on.rb
Ich habe es zu einem Permalink aktualisiert. Das moderne Äquivalent ist discourse_connect_base.rb
Danke! Aber wie kann ich meinen Benutzer nach der Anmeldung mit SSO als Administrator festlegen?
Bitte eröffnen Sie ein neues #support-Thema mit Informationen darüber, was Sie bisher versucht haben und was das Ergebnis war.

