ios – 在Swift中解码JSON Web令牌

前端之家收集整理的这篇文章主要介绍了ios – 在Swift中解码JSON Web令牌前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
尝试在 Swift中解码JWT有效负载并且遇到非常困难的时间
  1. static func decodePayload(tokenstr: String) {
  2.  
  3. //splitting JWT to extract payload
  4. let arr = split(tokenstr) {$0 == "."}
  5.  
  6. //base64 encoded string i want to decode
  7. let base64String = arr[1] as String
  8. println(base64String) //eyJleHAiOjE0MjY4MjIxNjMsImlkIjoiNTUwYjA3NzM4ODk1NjAwZTk5MDAwMDAxIn0
  9.  
  10. //attempting to convert base64 string to nsdata
  11. let nsdata: NSData = NSData(base64EncodedString: base64String,options: NSDataBase64DecodingOptions(rawValue: 0))
  12.  
  13. //decoding fails because nsdata unwraps as nil
  14. let base64Decoded: NSString = NSString(data: nsdata!,encoding: NSUTF8StringEncoding)!
  15.  
  16.  
  17. }

解决方法

  1. eyJleHAiOjE0MjY4MjIxNjMsImlkIjoiNTUwYjA3NzM4ODk1NjAwZTk5MDAwMDAxIn0

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

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

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

现在解码按预期工作:

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

斯威夫特4:

  1. var base64String = "eyJleHAiOjE0MjY4MjIxNjMsImlkIjoiNTUwYjA3NzM4ODk1NjAwZTk5MDAwMDAxIn0"
  2.  
  3. if base64String.count % 4 != 0 {
  4. let padlen = 4 - base64String.count % 4
  5. base64String.append(contentsOf: repeatElement("=",count: padlen))
  6. }
  7.  
  8. if let data = Data(base64Encoded: base64String),encoding: .utf8) {
  9. print(str) // {"exp":1426822163,"id":"550b07738895600e99000001"}
  10. }

猜你在找的iOS相关文章