Discourse 作为 SSO 提供商:登录错误

我正在遵循这份指南:

我提供了正确的签名,但不知为何 Discourse 不接受它。

这是我正在访问的 URL:

以下是相关的错误日志:

消息

详细 SSO 日志:签名解析错误

负载签名无效

sso:已隐藏
sig: ae997097f358b7e08aa0568290b55ef6e2174077e96a1184153b1d8369d50f8
预期签名:ae997097f358b7e08aa0568290b55ef6e2174077e96a1184153b1d08369d50f8



回溯

/var/www/discourse/app/controllers/session_controller.rb:52:in `rescue in sso_provider'
/var/www/discourse/app/controllers/session_controller.rb:41:in `sso_provider'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.2.2/lib/action_controller/metal/basic_implicit_render.rb:6:in `send_action'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.2.2/lib/abstract_controller/base.rb:196:in `process_action'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.2.2/lib/action_controller/metal/rendering.rb:30:in `process_action'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.2.2/lib/abstract_controller/callbacks.rb:42:in `block in process_action'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activesupport-6.0.2.2/lib/active_support/callbacks.rb:135:in `run_callbacks'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.2.2/lib/abstract_controller/callbacks.rb:41:in `process_action'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.2.2/lib/action_controller/metal/rescue.rb:22:in `process_action'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.2.2/lib/action_controller/metal/instrumentation.rb:33:in `block in process_action'

环境

HTTP HOSTS: discuss.bevry.me

以下是相关设置:

以下是 Cloudflare Worker 的代码:

已隐藏 - 稍后将开源

不过,问题可能出在我们这边,因为以下两者存在差异:

  • ae997097f358b7e08aa0568290b55ef6e2174077e96a1184153b1d8369d50f8
  • ae997097f358b7e08aa0568290b55ef6e2174077e96a1184153b1d08369d50f8

不过我不确定如何解决这个问题。

好的,使用这个方法解决了:

// https://jameshfisher.com/2017/10/31/web-cryptography-api-hmac/
// https://stackoverflow.com/questions/40031688/javascript-arraybuffer-to-hex
export function buf2hex(buffer: ArrayBuffer): string {
	return Array.prototype.map
		.call(new Uint8Array(buffer), (x) => ('00' + x.toString(16)).slice(-2))
		.join('')
}