ios - 在 Swift 中解码 JSON Web token

标签 ios swift base64 jwt

尝试在 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 编码字符串,因为它的长度 不是 4 的倍数。一些 Base64 解码器容忍这个错误,但是 NSData 方法没有。

所以这实际上是服务器端创建 Base64 编码的字符串。如有必要,您可以在您的应用程序中修复它 通过使用 = 字符添加所需的填充(针对 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"}
}

swift 4:

var base64String = "eyJleHAiOjE0MjY4MjIxNjMsImlkIjoiNTUwYjA3NzM4ODk1NjAwZTk5MDAwMDAxIn0"

if base64String.count % 4 != 0 {
    let padlen = 4 - base64String.count % 4
    base64String.append(contentsOf: repeatElement("=", count: padlen))
}

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

关于ios - 在 Swift 中解码 JSON Web token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29152706/

相关文章:

ios - 如何在 UILabel 中显示表达程度? ( swift )

ios - Swift 和 Sprite Kit - 如何测量 Sprite 移动的总距离?

javascript - 解码使用 imap Nodejs 检索到的 Base64 图像电子邮件附件

PHP - 添加/删除回车到 base 64 编码字符串

ios - 如何异步发送和接收来自外部配件的数据

iphone - 在iPhone中打开Skype或Gtalk

ios - 我的应用程序中的 iAd 不起作用

ios - 无法在服务器(SpringBoot)和 iOS 之间建立 WebSocket 连接

ios - Xcode6 快速类型推断错误?

python - Gzip 到 base64 编码将字符添加到 JSON 字符串