【问题标题】:Create ordered json string to use for key signing创建用于密钥签名的有序 json 字符串
【发布时间】:2019-09-07 09:38:28
【问题描述】:

为了理解这个问题,我需要提供一些我想要达到的目标的背景。

我正在尝试使用此 library 创建一个 JWT,它将使用私钥进行签名。

我的问题是我用来创建 JSON 的字典是无序的,因此会导致 JSON 字符串无序。

下面的代码以任意顺序打印 JSON 字符串。

let dictionary = ["aKey": "aValue", "anotherKey": "anotherValue"]

    if let theJSONData = try?  JSONSerialization.data(
      withJSONObject: dictionary,
      options: .prettyPrinted
      ),
      let theJSONText = String(data: theJSONData,
                               encoding: String.Encoding.ascii) {
          print("JSON string = \n\(theJSONText)")
    }
let privateKey = theJSONText.data(using: .utf8)
let jwtSigner = JWTSigner.hs256(privateKey: privateKey)
let signedJWT = try myJWT.sign(using: jwtSigner) // This produces a JWT with an invalid signature

这样做的结果是我的 JWT 产生了一个无效的签名。如何生成有顺序的 JSON 字符串?

【问题讨论】:

  • 字典根据定义是无序的,因此顺序无关紧要。但是,您应该删除添加不必要的空白字符的prettyPrinted 选项。服务器根本不关心人类的可读性。 privateKey 是可选的,这也可能是一个问题。使用非可选的let privateKey = Data(theJSONText.utf8) 创建数据
  • 顺序很重要,因为我需要我的 JSON 字符串按照这个确切的顺序 "{"aKey": "aValue", "anotherKey": "anotherValue"}" 否则 privateKey 数据无效
  • 您确定是字典顺序导致了您的问题吗?
  • 我敢肯定,它毕竟是创建字符串的字典,如果字典是无序的,那么字符串也是

标签: json swift xcode dictionary data-structures


【解决方案1】:

JSONEncoder 总是以相同的顺序对字典进行编码(但是可能不是是字典的给定顺序)。但也许它可以满足您的需求。

if let theJSONData = try? JSONEncoder().encode(dictionary) {
    let theJSONText = String(data: theJSONData, encoding: .utf8)!
    print("JSON string = \n\(theJSONText)")
}

还有OutputFormattingsortedKeys选项

而且 - 再一次 - 从不 prettyPrint 任何将被发送到服务器的东西。

【讨论】:

  • 我了解 prettyprinting,我仅将其用于调试目的。使用 JSONEncoder 无法解决该问题,因为字典的顺序可能仍然错误。请注意print 语句每次如何生成不同的字符串。
  • 您是否尝试添加sortedKeys 选项?如果它不起作用,您必须手动构建 JSON 字符串
  • 是的,我已经完成了。手动构建 JSON 字符串也不起作用,因为从 JSONSerialization 获取字符串数据会从字符串而不是 JSON 生成字节。
  • JSON 一个字符串。您可以使用字符串插值构建 JSON 字符串并将其转换为 Data(无需 JSONSerialization)。
  • 我尝试将其添加为字符串并将其转换为 .utf8 数据:"{"aKey":"aValue",anotherKey": "anotherValue"}" 但 JWT 签名仍然无效。我认为这可能是由于字符串转换为 Data 时包含的转义字符
猜你喜欢
  • 2021-06-22
  • 2022-01-22
  • 1970-01-01
  • 2014-05-12
  • 1970-01-01
  • 2017-01-17
  • 1970-01-01
  • 2016-09-15
  • 2014-02-06
相关资源
最近更新 更多