【发布时间】: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