我想我会先删除我们当前的 Droplet,然后从头开始重新搭建,因为这个 Docker 环境是几年前设置的。完成并测试后,我会回来汇报。
听起来是个不错的计划。对于大多数社区,我们建议坚持使用默认的 tests-passed 分支,因为它能提供 Discourse 最新的功能和错误修复。自上一个稳定版本发布以来,认证机制发生了许多变化,因此你可能会发现一些问题会自动解决。
@david,我今天又花了一些时间重新尝试。现在我使用的是全新的 Discourse 安装(稳定版最新,正如你所建议的)。
我像之前一样通过插件配置了 OAuth2,设置如下:
oauth2 client id: MY-CLIENT-ID
oauth2 client secret: MY-CLIENT-SECRET
oauth2 authorize url: https://MY-NEON-ID.z2systems.com/np/oauth/auth
oauth2 token url: https://www.z2systems.com/np/oauth/token
如果我使用手动格式化的 URL,会得到以下(这是新出现的)错误:
授权超时,或您已切换浏览器。请重试。
日志中仍然出现常见的错误:
(oauth2_basic) 认证失败!csrf_detected: OmniAuth::Strategies::OAuth2::CallbackError, csrf_detected | CSRF detected
另一方面,如果我使用 Discourse 登录窗口中的 OAuth2 按钮,则会显示:
哎呀
支撑此讨论论坛的软件遇到了意外问题。对此造成的不便我们深表歉意。
有关该错误的详细信息已记录在案,并生成了自动通知。我们将对此进行查看。
我在 /logs 中也看到了以下错误日志:
ArgumentError (无效的 URI: ) /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/excon-0.71.0/lib/excon.rb:126:in `new'
以及
在异常应用中间件中处理异常失败:无效的 URI:
@david 我尝试了你之前关于设置 oauth2_user_json_url 并禁用 oauth2_fetch_user_details 的建议,但在尝试后出现了一堆(新的)错误:
ActiveRecord::NotNullViolation (PG::NotNullViolation: 错误:column “provider_uid” 中的 null 值违反了 not-null 约束
DETAIL: 失败的行包含 (1, oauth2_basic, null, null, 2019-12-19 01:00:49.076659, {}, {“token”: “9607”, “expires”: false}, {}, 2019-12-19 01:00:49.077107, 2019-12-19 01:00:49.077107)。
)
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-mini-profiler-1.1.4/lib/patches/db/pg.rb:69:in `async_exec_params’
在异常应用中间件中处理异常失败:PG::NotNullViolation: 错误:column “provider_uid” 中的 null 值违反了 not-null 约束
DETAIL: 失败的行包含 (1, oauth2_basic, null, null, 2019-12-19 01:00:49.076659, {}, {“token”: “9607”, “expires”: false}, {}, 2019-12-19 01:00:49.077107, 2019-12-19 01:00:49.077107)。
当然还有通常出现的:
(oauth2_basic) 认证失败!csrf_detected: OmniAuth::Strategies::OAuth2::CallbackError, csrf_detected | 检测到 CSRF
不过,我在最后这个(CSRF Detected)错误中注意到,在 env 选项卡中显示:
hostname forum-app
process_id 762
application_version db7d00a8dce2cc1f7b9d86192cde1f55dd57408b
HTTP_HOST forum.efao.ca
hostname 与 HTTP_HOST 名称不匹配是正常的吗?这是否就是我遇到 CSRF 错误的原因?
嘿,Denis,
有进展吗?
我遇到了同样的错误:
ActiveRecord::NotNullViolation (PG::NotNullViolation: 错误:列 “provider_uid” 中的空值违反了非空约束
你是怎么解决的?
谢谢,
Beam
Denis 和我发现 NeonCRM 并没有真正遵循 OAuth2 规范……他们把 user_id 放在 access_token 变量中发送,但这不能用作实际的访问令牌。
因此,你需要禁用 oauth2_fetch_user_details,并将 oauth2_callback_user_id_path 设置为 token(不是 access_token,因为 oauth2 Ruby 库在内部使用时会重命名它)
这样设置后,功能应该可以正常运行,但无法获取用户的邮箱和姓名。
嘿,Denis,
我使用的是 Mattermost,所以表现有所不同。
不过,你的信息让我更仔细地查看了设置,现在它已经可以正常工作了,谢谢!!
以下是我将 Mattermost 配置为 OAuth2 提供商以对接 Discourse 的设置:
供搜索引擎检索的文本设置:
oauth2 client id: <来自 Mattermost OAuth2 提供商设置的客户端 ID>
oauth2 client secret: <来自 Mattermost OAuth2 提供商设置的客户端密钥>
oauth2 authorize url:https://chat.animalrebellion.org/oauth/authorize
oauth2 token url:https://chat.animalrebellion.org/oauth/access_token
oauth2 token url method: POST
oauth2 callback user id path:
oauth2 callback user info paths
oauth2 fetch user details: 已勾选
oauth2 user json url:https://chat.animalrebellion.org/api/v4/users/me
oauth2 user json url method: GET
oauth2 json user id path: id
oauth2 json username path: username
oauth2 json name path: username
oauth2 json email path: email
oauth2 json email verified path: email_verified
oauth2 json avatar path:
oauth2 email verified: 已勾选
在 Mattermost 一侧,回调 URL 设置为:
https://base.animalrebellion.org/auth/oauth2_basic/callback
我仍然希望能看到如何将 first_name 和 last_name 合并到“JSON name path”中以生成 full_name,不过目前仅使用“username”或“first_name”属性也可以接受。
希望这能帮到你!
祝好!
Beam
相关资源链接:
插件链接:GitHub - discourse/discourse-oauth2-basic: A basic OAuth2 plugin for use with Discourse · GitHub
Discourse 插件安装指南:Install plugins on a self-hosted site
很高兴你解决了这个问题,@Beam!
