DiscourseSsoController#sso 中的错误 ArgumentError,参数数量错误(给定 1,预期 0)

按照指南 https://meta.discourse.org/t/discourseconnect-official-single-sign-on-for-discourse-sso/13045,我已启用 Discourse SSO 以与现有的 RoR 应用共享登录功能,但在重定向到我的网站并完成登录后,我收到了“错误:ArgumentError in DiscourseSsoController#sso,参数数量错误(给定 1 个,期望 0 个)”。

查看截图,该错误似乎来自您的自定义 Rails 应用,而非 Discourse。是这样吗?我认为 Discourse 并没有 DiscourseSsoController#sso 方法,而且堆栈跟踪看起来也不像 Discourse 的。

您是如何在 Rails 应用中实现该方法的?是否从 Discourse 的代码库中导入了部分代码?如果是,您的导入可能会受到此变更的影响:SECURITY: Attach DiscourseConnect (SSO) nonce to current session (#12… · discourse/discourse@13d2a1f · GitHub

1 个赞

这个类位于我的应用中,但它源自 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 的内容?我想我们可能需要在文档中对此进行更新。您能否尝试在您的 single_sign_on.rb 文件中的 SingleSignOn 类里添加一个新函数?

def initialize(**kwargs)
end

我认为这应该能解决您遇到的错误。

您能否也确认一下您使用的 Ruby 版本?

1 个赞

是的,我已经复制了 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! # 确保用户必须登录
1 个赞

好的,我自己也遇到了这个问题。
看起来参考实现使用了一个仅在 Ruby 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 的项目或在调用时传入某些关键字参数(kwargs)的用户没有帮助。
因此,至少我认为 SingleSignOn 应该实现 def initialize(**kwargs); end

@david 链接已损坏 single_sign_on.rb

我已将其更新为永久链接。现代对应项是 discourse_connect_base.rb

1 个赞

谢谢!但是,在通过 SSO 登录后,我该如何将我的用户设置为管理员?

请开启一个新的 Support 主题,并附上您到目前为止尝试过的内容以及结果信息。

2 个赞