Erreur ArgumentError dans DiscourseSsoController#sso, mauvais nombre d'arguments (donné 1, attendu 0)

En suivant le guide Setup DiscourseConnect - Official Single-Sign-On for Discourse (sso), j’ai activé Discourse SSO pour partager la connexion avec mon application RoR existante, mais j’obtiens l’erreur « Error ArgumentError in DiscourseSsoController#sso, wrong number of arguments (given 1, expected 0) » après avoir été redirigé vers mon site web et avoir effectué la connexion.

En examinant la capture d’écran, cette erreur semble provenir de votre application Rails personnalisée plutôt que de Discourse. Est-ce exact ? Je ne pense pas que Discourse possède une méthode DiscourseSsoController#sso, et la trace d’appel ne ressemble pas non plus à celle de Discourse.

Comment avez-vous implémenté cette méthode dans votre application Rails ? Avez-vous importé certaines parties du code depuis la base de code de Discourse ? Si oui, vos imports pourraient être affectés par ce changement : SECURITY: Attach DiscourseConnect (SSO) nonce to current session (#12… · discourse/discourse@13d2a1f · GitHub

1 « J'aime »

Cette classe se trouve dans mon application, mais il s’agit de code officiel provenant de Setup DiscourseConnect - Official Single-Sign-On for Discourse (sso) que j’ai intégré dans mon application pour gérer l’authentification unique (SSO).

J’ai également suivi le guide disponible sur https://stackoverflow.com/questions/25478510/incorporating-discourse-sso-with-existing-rails-site-with-devise

Je vois, vous avez donc copié le contenu de single_sign_on.rb ? Je pense qu’une mise à jour de la documentation serait nécessaire ici. Pourriez-vous essayer d’ajouter une nouvelle fonction dans la classe SingleSignOn de votre fichier single_sign_on.rb ?

def initialize(**kwargs)
end

Je pense que cela devrait résoudre l’erreur que vous rencontrez.

Pourriez-vous également me confirder quelle version de Ruby vous utilisez ?

1 « J'aime »

Oui, j’ai copié le contenu de single_sign_on.rb

J’utilise Ruby 2.4.6

Après avoir ajouté l’initialisation, l’erreur a changé

Avez-vous redémarré le serveur ? Je ne vois pas pourquoi une erreur serait levée sur une ligne end, donc je soupçonne que le code en cours d’exécution ne correspond pas à celui présent sur le système de fichiers ?

Cela pourrait bien faire partie du problème. Le code de Discourse est entièrement écrit pour la version 2.7 et supérieure.

Désolé, c’est de ma faute. Je n’ai pas redémarré le serveur, n’ayant pas remarqué que la modification concernait un initialisateur.

Avec Devise et CanCanCan, j’ai dû également faire ceci : commenter before_action et ajouter skip_authorization_check :

class DiscourseSsoController < ApplicationController
   skip_authorization_check
   #before_action :authenticate_user! # assure que l'utilisateur doit être connecté
1 « J'aime »

Ok, je viens tout juste de rencontrer ce problème moi-même.
Il semble que l’implémentation de référence utilise une fonctionnalité qui fonctionne à partir de la version 2.7 : l’instanciation d’un objet avec une référence de hachage vide.

args = {}
class A; end
A.new(**args) # Fonctionne uniquement si ruby >= 2.7

Même avec Ruby >= 2.7, le code de référence (lib/single_sign_on.rb) lèvera une erreur si vous passez un hachage lors de l’appel à #parse, car à la ligne 65 de lib/single_sign_on.rb, il appelle sso = new(**init_kwargs), tandis que #initialize(secure_session:) est défini dans app/models/discourse_single_sign_on.rb:28, même si DiscourseSingleSignOn hérite de SingleSignOn.

Cela n’aiderait pas les personnes utilisant ce code qui utilisent soit Ruby < 2.7 dans leur projet, soit qui passent des arguments nommés (kwargs).
Donc oui, au minimum, je pense que SingleSignOn devrait implémenter def initialize(**kwargs); end.

@david le lien pour est cassé single_sign_on.rb

Je l’ai mis à jour pour que ce soit un permalien. L’équivalent moderne est discourse_connect_base.rb

1 « J'aime »

Merci ! Mais comment puis-je définir mon utilisateur comme administrateur après m’être connecté via l’authentification unique (SSO) ?

Veuillez ouvrir un nouveau sujet de Support avec des informations sur ce que vous avez déjà essayé et quel a été le résultat.

2 « J'aime »