DiscourseConnect 有效载荷哈希编码不匹配

我还没有在我的网站上测试过这个,在这样做之前,我正尝试手动理清步骤。

来自之前引用的论坛帖子:

给定以下设置:
Discourse 域名:http://discuss.example.com
DiscourseConnect URL:http://www.example.com/discourse/sso
DiscourseConnect 密钥:d836444a9e4084d5b224a60c208dce14

用户尝试登录

  • 生成 Nonce:cb68251eefb5211e58c00ff1395f0c0b
  • 生成原始负载(Raw payload):nonce=cb68251eefb5211e58c00ff1395f0c0b
  • 对负载进行 Base64 编码:bm9uY2U9Y2I2ODI1MWVlZmI1MjExZTU4YzAwZmYxMzk1ZjBjMGI=\n
  • 对负载进行 URL 编码:bm9uY2U9Y2I2ODI1MWVlZmI1MjExZTU4YzAwZmYxMzk1ZjBjMGI%3D%0A
  • 对 Base64 编码后的负载生成 HMAC-SHA256:2828aa29899722b35a2f191d34ef9b3ce695e0e6eeec47deb46d588d70c7cb56

在这里我得到了不同的结果。当我使用你建议的 HMAC 编码器对未进行 URL 编码的 Base64 负载进行处理时,我得到的是 d26d5adf900de48890a0c3dcdeec108acd91b44a4b76c90c59955a5ba7b957f7,而不是 2828aa29899722b35a2f191d34ef9b3ce695e0e6eeec47deb46d588d70c7cb56。当我对 URL 编码后的负载使用它时,我得到的是 46e749cd26dcabc84eed323ff31f830da674dc87c77a2fcb1b296f76402ea900

然而,在教程的后面部分,在创建新负载时:

生成未签名的负载:
nonce=cb68251eefb5211e58c00ff1395f0c0b&name=sam&username=samsam&email=test%40test.com&external_id=hello123&require_activation=true
(顺序不重要,值已进行 URL 编码)

对负载进行 Base64 编码
bm9uY2U9Y2I2ODI1MWVlZmI1MjExZTU4YzAwZmYxMzk1ZjBjMGImbmFtZT1zYW0mdXNlcm5hbWU9c2Ftc2FtJmVtYWlsPXRlc3QlNDB0ZXN0LmNvbSZleHRlcm5hbF9pZD1oZWxsbzEyMyZyZXF1aXJlX2FjdGl2YXRpb249dHJ1ZQ==

对负载进行 URL 编码
bm9uY2U9Y2I2ODI1MWVlZmI1MjExZTU4YzAwZmYxMzk1ZjBjMGImbmFtZT1zYW0mdXNlcm5hbWU9c2Ftc2FtJmVtYWlsPXRlc3QlNDB0ZXN0LmNvbSZleHRlcm5hbF9pZD1oZWxsbzEyMyZyZXF1aXJlX2FjdGl2YXRpb249dHJ1ZQ%3D%3D

对 Base64 编码后的负载进行签名
3d7e5ac755a87ae3ccf90272644ed2207984db03cf020377c8b92ff51be3abc3

这个签名是通过对未进行 URL 编码的 Base64 负载进行哈希生成的,这就是为什么我对它为什么在第一个负载上不起作用感到有些不确定。