Errore ArgumentError in DiscourseSsoController#sso, numero errato di argomenti (dato 1, previsto 0)

Seguendo la guida Setup DiscourseConnect - Official Single-Sign-On for Discourse (sso) ho abilitato Discourse SSO per condividere il login con la mia applicazione RoR esistente, ma ricevo “Errore ArgumentError in DiscourseSsoController#sso, numero errato di argomenti (1 fornito, 0 atteso)” dopo essere stato reindirizzato al mio sito web e aver effettuato l’accesso.

Guardando lo screenshot, sembra che quell’errore provenga dalla tua applicazione Rails personalizzata, e non da Discourse. È corretto? Non credo che Discourse abbia un metodo DiscourseSsoController#sso, e lo stack trace non sembra nemmeno appartenere a Discourse.

Come hai implementato quel metodo nella tua applicazione Rails? Hai importato alcune parti del codice dal codice sorgente di Discourse? Se sì, le tue importazioni potrebbero essere state influenzate da questa modifica: SECURITY: Attach DiscourseConnect (SSO) nonce to current session (#12… · discourse/discourse@13d2a1f · GitHub

1 Mi Piace

Questa classe fa parte della mia applicazione, ma si tratta di codice ufficiale tratto da Setup DiscourseConnect - Official Single-Sign-On for Discourse (sso), che ho inserito nella mia applicazione per gestire l’SSO.

Ho seguito anche https://stackoverflow.com/questions/25478510/incorporating-discourse-sso-with-existing-rails-site-with-devise

Capisco, quindi hai copiato il contenuto di single_sign_on.rb? Immagino che qui potrebbe essere necessario un aggiornamento della documentazione. Puoi provare ad aggiungere una nuova funzione all’interno della classe SingleSignOn nel tuo file single_sign_on.rb?

def initialize(**kwargs)
end

Penso che questo dovrebbe risolvere l’errore che stai riscontrando.

Puoi anche confermare quale versione di Ruby stai utilizzando?

1 Mi Piace

Sì, ho copiato il contenuto di single_sign_on.rb

Sto usando Ruby 2.4.6

Dopo aver aggiunto initialize, l’errore è cambiato

Hai riavviato il server? Non riesco a immaginare perché un errore venga sollevato su una riga end, quindi sospetto che il codice in esecuzione non corrisponda a quello presente nel filesystem?

Potrebbe essere proprio questo parte del problema. Il codice di Discourse è stato scritto tutto per la versione 2.7 e superiori.

Scusate, è colpa mia: non ho riavviato il server, non avendo notato che la modifica era nell’initializer.
Con Devise e CanCanCan ho dovuto anche fare questo: commentare before_action e aggiungere skip_authorization_check:

class DiscourseSsoController < ApplicationController
   skip_authorization_check
   #before_action :authenticate_user! # assicura che l'utente debba effettuare il login
1 Mi Piace

Ok, mi sono imbattuto proprio in questo.
Sembra che l’implementazione di riferimento utilizzi una funzionalità che funziona dalla versione 2.7 in poi, ovvero l’istanziazione di un oggetto con un riferimento a un hash vuoto.

args = {}
class A; end
A.new(**args) #= works only if ruby >= 2.7

Anche in Ruby >= 2.7, il codice di riferimento (lib/single_sign_on.rb) genererà un errore se si passa un hash durante la chiamata a #parse, perché su lib/single_sign_on.rb:65 viene chiamato sso = new(**init_kwargs) e #initialize(secure_session:) è definito in app/models/discourse_single_sign_on.rb:28, anche se DiscourseSingleSignOn eredita da SingleSignOn.

Questo non aiuterebbe chi utilizza quel codice e usa Ruby < 2.7 nel proprio progetto o passa alcuni keyword arguments.
Quindi sì, almeno SingleSignOn dovrebbe implementare def initialize(**kwargs);end.

@david il link per è interrotto single_sign_on.rb

L’ho aggiornato per essere un permalink. L’equivalente moderno è discourse_connect_base.rb

1 Mi Piace

Grazie! Ma come posso impostare il mio utente come amministratore dopo l’accesso tramite SSO?

Apri un nuovo argomento Support con informazioni su ciò che hai provato finora e quale è stato il risultato.

2 Mi Piace