Ios 在Swift中解码JSON Web令牌

Ios 在Swift中解码JSON Web令牌,ios,swift,base64,jwt,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 printl

试图在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)!


}
不是有效的Base64编码字符串,因为其长度 不是4的倍数。某些Base64解码器可以容忍此错误,但是
NSData
方法没有

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

现在解码工作如预期:

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"}
}

以上解决方案对我有效,我转换成swift3

在这里您可以找到swift3代码

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"}
    }

作为最佳实践,jwt令牌应该存储在哪里?我一直在想它应该和用户名和密码一起存储到keychain中。@user805981:我实际上对jwt令牌一无所知。但是是的,像密码这样的敏感数据应该存储在钥匙链中。谢谢。关于钥匙链。每个应用程序的钥匙链可以存储多少钥匙链词典?在Swift 4中,使用数据比使用NSData更好(使用数据比将NSData转换为数据更好)。无论如何,@raju abe在回答中已经给出了Swift 3+的更新。请不要发布重复/不完整的内容。
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)
}
if let data = Data(base64Encoded: base64String, options: []),
        let str = String(data: data as Data, encoding: String.Encoding.utf8) {
        print(str) // {"exp":1426822163,"id":"550b07738895600e99000001"}
    }