Следуя руководству Setup DiscourseConnect - Official Single-Sign-On for Discourse (sso), я включил Discourse SSO для единого входа с моим существующим приложением на RoR, но после перенаправления на мой сайт и входа в систему получаю ошибку: «Error ArgumentError in DiscourseSsoController#sso, wrong number of arguments (given 1, expected 0)».
Судя по скриншоту, эта ошибка возникает в вашем собственном приложении на Rails, а не в Discourse. Так ли это? Я не думаю, что в Discourse есть метод DiscourseSsoController#sso, и трассировка стека тоже не похожа на ту, что генерирует Discourse.
Как вы реализовали этот метод в своём приложении на Rails? Импортировали ли вы какие-то части кода из репозитория Discourse? Если да, то ваши импорты могут быть затронуты этим изменением: SECURITY: Attach DiscourseConnect (SSO) nonce to current session (#12… · discourse/discourse@13d2a1f · GitHub
Этот класс находится в моём приложении, но это официальный код с Setup DiscourseConnect - Official Single-Sign-On for Discourse (sso), который я добавил в своё приложение для управления SSO.
Также следовал инструкции с https://stackoverflow.com/questions/25478510/incorporating-discourse-sso-with-existing-rails-site-with-devise
Понятно, значит, вы скопировали содержимое single_sign_on.rb? Похоже, нам потребуется обновление документации. Можете попробовать добавить новую функцию внутрь класса SingleSignOn в вашем файле single_sign_on.rb?
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! # гарантирует, что пользователь должен войти в систему
Хорошо, я сам только что столкнулся с этим.
Похоже, что в референсной реализации используется функция, работающая в версиях 2.7 и выше — создание объекта с пустой ссылкой на хэш.
args = {}
class A; end
A.new(**args) #=> работает только при ruby >= 2.7
Даже в ruby >= 2.7 референсный код (lib/single_sign_on.rb) вызовет ошибку, если вы передадите хэш при вызове #parse, потому что в lib/single_sign_on.rb:65 вызывается sso = new(**init_kwargs), а #initialize(secure_session:) определён в app/models/discourse_single_sign_on.rb:28, даже несмотря на то, что DiscourseSingleSignOn наследуется от SingleSignOn.
Это не поможет тем, кто использует этот код и либо применяет ruby < 2.7 в своём проекте, либо передаёт какие-либо именованные аргументы.
Так что да, как минимум, я считаю, что SingleSignOn должен реализовать def initialize(**kwargs);end
@david ссылка не работает single_sign_on.rb
Я обновил это до постоянной ссылки. Современный аналог — discourse_connect_base.rb
Спасибо! Но как можно назначить моего пользователя администратором после входа через SSO?
Пожалуйста, создайте новую тему в разделе Support с информацией о том, что вы уже пробовали, и каковы были результаты

