【问题标题】:JWTs before decoding and after signing are different解码前和签名后的 JWT 不同
【发布时间】:2019-08-09 02:00:42
【问题描述】:

我正在测试将数据从现有服务器迁移到新服务器的过程。

其中一部分是检查以确保保存在旧服务器上的JWTs 被正确发送到新服务器。该过程是从旧服务器获取令牌到测试服务器,然后将它们发送到新服务器以检查它们是否存在。旧服务器将unsigned JWTs 发送到我的测试服务器,然后我需要对它们进行签名以便对照新服务器检查它们。

为了获得这些令牌的签名,运行以下代码:

// Get the object represented by the token
this.token = jwt.decode(`${this.unsignedToken}.a`)

// Turn the object into a signed token string
this.signedToken = jwt.sign(this.token, this.tokenSecret)

我将 '.a' 连接到 unsignedToken 的末尾,因为 jwt.decode 需要一个 "已签名"" 令牌才能取回数据.

我遇到的问题是 unsignedToken 和signedToken 没有JWT 的相同有效负载部分,即使它们都解码为完全相同的对象。因此,signedTokens 发送到的端点无法将它们与该服务器上的内容正确匹配。

当我针对新服务器的数据库手动检查unsigned 令牌时,它确实存在,但由于signedToken 不是签名之前的同一个字符串,因此测试过程将不起作用。

我做错了吗?

编辑:

答案:

当我在https://www.base64decode.org/ 手动将这两个令牌解码为base64 时,我发现unsignedToken 包含一个看起来像“https:\/\/”的URL,而signedToken 的URL 是“https: //"。

对于遇到这种情况的任何人,我的最终解决方案是我如何签署令牌:

this.signedToken = jwt.sign(JSON.stringify(this.token).replace(/\//g, '\\/'), this.tokenSecret)

【问题讨论】:

  • "没有相同的 jwt 有效负载部分" --- 它们到底有什么不同?是base64,手动解码比较。
  • "即使它们都解码为完全相同的对象" - 那么它们的编码值也应该相同。请发布一个这样的例子。
  • @Bergi 我敢打赌那些将是 JSON 对象,键的顺序不同。
  • 如果您找到了问题的答案,请。在下面的答案字段中写下答案,而不是将答案编辑到您的问题中。

标签: javascript node.js jwt


【解决方案1】:

当我在https://www.base64decode.org/ 手动将这两个令牌解码为 base64 时,我发现 unsignedToken 包含一个看起来像“https:\/\/”的 URL,而 signedToken 的 url 是“https://”。

对于遇到这种情况的任何人,我的最终解决方案是我如何签署令牌:

this.signedToken = jwt.sign(JSON.stringify(this.token).replace(/\//g, '\\/'), this.tokenSecret)

【讨论】:

  • 是的,zerkms,你说得对。这是我为测试人员提供的解决方案,但对于阅读本文的任何人,在生产中使用它时要非常小心。
猜你喜欢
  • 2023-02-08
  • 2018-04-19
  • 2015-11-23
  • 2016-11-30
  • 2017-03-06
  • 2022-10-31
  • 2017-03-02
  • 2016-03-19
  • 2019-09-06
相关资源
最近更新 更多