2015-03-19 6 views
7

स्विफ्ट में एक जेडब्ल्यूटी पेलोड को डिकोड करने की कोशिश कर रहा है और एक सच में कठिन समयडिकोडिंग JSON वेब टोकन स्विफ्ट में

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)! 


} 

उत्तर

14
eyJleHAiOjE0MjY4MjIxNjMsImlkIjoiNTUwYjA3NzM4ODk1NjAwZTk5MDAwMDAxIn0 

एक वैध Base64 इनकोडिंग स्ट्रिंग नहीं है होने क्योंकि इसकी लंबाई 4 की एक बहु नहीं है कुछ बेस 64 डीकोडर इस त्रुटि को सहन करते हैं, लेकिन NSData विधियां नहीं हैं।

तो यह वास्तव में सर्वर पक्ष पर बेस 64 एन्कोडेड स्ट्रिंग बनाने में एक त्रुटि है। यदि आवश्यक हो, आप = (स्विफ्ट 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"} 
} 
+0

जहां वास्तव में टोकन सबसे अच्छा अभ्यास के रूप में संग्रहित किया जा जेडब्ल्यूटी चाहिए? मैं सोच रहा हूं कि इसे उपयोगकर्ता नाम और पासवर्ड के साथ कीचेन में संग्रहीत किया जाना चाहिए। – user805981

+0

@ user805981: मैं वास्तव में jwt टोकन के बारे में कुछ भी नहीं जानता। लेकिन हां, पासवर्ड जैसे संवेदनशील डेटा कीचेन में संग्रहीत किया जाना चाहिए। –

+0

धन्यवाद। Keychains के बारे में। प्रति ऐप स्टोर करने में सक्षम कीचेन कितने कीचेन शब्दकोश हैं? क्या यह प्रति ऐप अनंत या एक पासवर्ड कीचेन है? – user805981

4

से ऊपर समाधान मेरे लिए काम कर रहा है, मैं 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) 
} 
-1

स्विफ्ट 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"} 
    } 
+1

स्विफ्ट 4 में एनएसडेटा की तुलना में डेटा का उपयोग करना बेहतर है (और डेटा को एनएसडीटा डालने के बजाय डेटा का उपयोग करने के लिए बेहतर तरीका)। और * वैसे भी *, स्विफ्ट 3+ के लिए अपडेट पहले से ही उनके उत्तर में @ राजू-एबे द्वारा दिया गया है। कृपया डुप्लिकेट/अपूर्ण सामग्री पोस्ट न करें। – Moritz

संबंधित मुद्दे