Erro ArgumentError em DiscourseSsoController#sso, número incorreto de argumentos (dado 1, esperado 0)

Seguindo o guia Setup DiscourseConnect - Official Single-Sign-On for Discourse (sso), ativei o Discourse SSO para compartilhar o login com meu aplicativo RoR existente, mas recebo o erro “Error ArgumentError in DiscourseSsoController#sso, wrong number of arguments (given 1, expected 0)” após ser redirecionado para meu site e ter feito o login.

Analisando a captura de tela, parece que esse erro está vindo do seu aplicativo Rails personalizado, e não do Discourse. Está correto? Acredito que o Discourse não tenha um método DiscourseSsoController#sso, e o rastreamento de erro também não parece ser do Discourse.

Como você implementou esse método no seu aplicativo Rails? Você importou algumas partes do código da base de código do Discourse? Se sim, suas importações podem ser afetadas por essa alteração: SECURITY: Attach DiscourseConnect (SSO) nonce to current session (#12… · discourse/discourse@13d2a1f · GitHub

Esta classe está na minha aplicação, mas é código oficial de Setup DiscourseConnect - Official Single-Sign-On for Discourse (sso) que eu coloquei na minha aplicação para gerenciar o SSO.

Também segui https://stackoverflow.com/questions/25478510/incorporating-discourse-sso-with-existing-rails-site-with-devise

Entendi, então você copiou o conteúdo de single_sign_on.rb? Acredito que talvez precisemos atualizar a documentação aqui. Você poderia tentar adicionar uma nova função dentro da classe SingleSignOn no seu arquivo single_sign_on.rb?

def initialize(**kwargs)
end

Acho que isso deve resolver o erro que você está vendo.

Você também pode confirmar qual versão do Ruby está usando?

Sim, copiei o conteúdo de single_sign_on.rb

Estou usando Ruby 2.4.6

Após adicionar o initialize, o erro mudou

Você reiniciou o servidor? Não consigo imaginar por que um erro seria gerado em uma linha end, então suspeito que o código em execução não corresponda ao que está no sistema de arquivos?

Isso pode ser parte do problema. O código do Discourse foi todo escrito para a versão 2.7 ou superior.

Desculpe, foi minha falha. Não reiniciei o servidor, pois não percebi que a modificação estava no initializer.

Com o Devise e o CanCanCan, também precisei fazer o seguinte: comentar o before_action e adicionar o skip_authorization_check:

class DiscourseSsoController < ApplicationController
   skip_authorization_check
   #before_action :authenticate_user! # garante que o usuário precise fazer login

Ok, acabei de encontrar isso também.
Parece que a implementação de referência usa um recurso que funciona a partir da versão 2.7+, que é instanciar um objeto com uma referência a um hash vazio.

args = {}
class A; end
A.new(**args) # funciona apenas se ruby >= 2.7

Mesmo no ruby >= 2.7, o código de referência (lib/single_sign_on.rb) gerará um erro se você passar um hash ao chamar #parse, porque em lib/single_sign_on.rb:65 ele chama sso = new(**init_kwargs) e #initialize(secure_session:) está definido em app/models/discourse_single_sign_on.rb:28, mesmo que DiscourseSingleSignOn herde de SingleSignOn.

Isso não ajudaria pessoas que usam esse código e ou utilizam ruby < 2.7 em seu projeto ou passam alguns argumentos nomeados.
Então, sim, no mínimo, acho que SingleSignOn deveria implementar def initialize(**kwargs); end.

@david o link para está quebrado single_sign_on.rb

Eu atualizei para ser um permalink. O equivalente moderno é discourse_connect_base.rb

Obrigado! Mas como posso definir meu usuário como administrador após o login usando SSO?

Abra um novo tópico de #suporte com informações sobre o que você já tentou e qual foi o resultado.