在Swift中解码JSON Web Tokens

试图在Swift中解码JWT的有效载荷,并且真的很困难

static func decodePayload(tokenstr: String) { //splitting JWT to extract payload let arr = split(tokenstr) {$0 == "."} //base64 encoded string i want to decode let base64String = arr[1] as String println(base64String) //eyJleHAiOjE0MjY4MjIxNjMsImlkIjoiNTUwYjA3NzM4ODk1NjAwZTk5MDAwMDAxIn0 //attempting to convert base64 string to nsdata let nsdata: NSData = NSData(base64EncodedString: base64String, options: NSDataBase64DecodingOptions(rawValue: 0)) //decoding fails because nsdata unwraps as nil let base64Decoded: NSString = NSString(data: nsdata!, encoding: NSUTF8StringEncoding)! } 

 eyJleHAiOjE0MjY4MjIxNjMsImlkIjoiNTUwYjA3NzM4ODk1NjAwZTk5MDAwMDAxIn0 

是不是一个有效的Base64编码的string,因为它的长度不是4的倍数。一些Base64解码器容忍这个错误,但NSData方法不。

所以这实际上是创buildBase64编码string的服务器端的错误。 如有必要,您可以通过添加所需的填充=字符(代码更新为Swift 2)来修复它在您的应用程序中:

 var base64String = arr[1] as String if base64String.characters.count % 4 != 0 { let padlen = 4 - base64String.characters.count % 4 base64String += String(count: padlen, repeatedValue: Character("=")) } 

现在解码按预期工作:

 if let data = NSData(base64EncodedString: base64String, options: []), let str = String(data: data, encoding: NSUTF8StringEncoding) { print(str) // {"exp":1426822163,"id":"550b07738895600e99000001"} } 

上面的解决scheme是为我工作,我转换成swift3

在这里你可以findswift3的代码

 var base64Str = arr[1] as String if base64Str.characters.count % 4 != 0 { let padlen = 4 - base64Str.characters.count % 4 base64Str += String(repeating: "=", count: padlen) } if let data = Data(base64Encoded: base64Str, options: []), let str = String(data: data, encoding: String.Encoding.utf8) { print(str) } 

Swift 4如下:

 if let data = Data(base64Encoded: base64String, options: []), let str = String(data: data as Data, encoding: String.Encoding.utf8) { print(str) // {"exp":1426822163,"id":"550b07738895600e99000001"} }