2016-12-01 15 views
-2

私はこのSwiftでJWT(Java Web Toolkit)トークンをデコードするにはどうすればよいですか?

{ "サブ" のようなペイロードを得ることができるように

がどのように私はこれをデコードすることができ、この

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQなどのJWTトークンを持っています: "1234567890"、 "名前": "John Doe"、 "admin":true}

答えて

2

迅速な実装があります。 CocoaPodを使用している場合、またはプロジェクトを複製して直接使用する場合は、これをPodfileに追加してください。

JSONWebToken

do { 
    // the token that will be decoded 
    let token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ" 
    let payload = try JWT.decode(token, algorithm: .hs256("secret".data(using: .utf8)!)) 
    print(payload) 
} catch { 
    print("Failed to decode JWT: \(error)") 
} 
7

ライブラリを使用して大丈夫です場合、私はこのhttps://github.com/auth0/JWTDecode.swift

を示唆して、ライブラリimport JWTDecodeをインポートし、実行します。

let jwt = try decode(jwt: token) 

あなたはこのライブラリを含めるようにしたくなかったので、私はそれを動作させるために必要な部品を出しました。

func decode(jwtToken jwt: String) -> [String: Any] { 
    let segments = jwt.components(separatedBy: ".") 
    return decodeJWTPart(segments[1]) ?? [:] 
} 

func base64UrlDecode(_ value: String) -> Data? { 
    var base64 = value 
    .replacingOccurrences(of: "-", with: "+") 
    .replacingOccurrences(of: "_", with: "/") 

    let length = Double(base64.lengthOfBytes(using: String.Encoding.utf8)) 
    let requiredLength = 4 * ceil(length/4.0) 
    let paddingLength = requiredLength - length 
    if paddingLength > 0 { 
    let padding = "".padding(toLength: Int(paddingLength), withPad: "=", startingAt: 0) 
    base64 = base64 + padding 
    } 
    return Data(base64Encoded: base64, options: .ignoreUnknownCharacters) 
} 

func decodeJWTPart(_ value: String) -> [String: Any]? { 
    guard let bodyData = base64UrlDecode(value), 
    let json = try? JSONSerialization.jsonObject(with: bodyData, options: []), let payload = json as? [String: Any] else { 
     return nil 
    } 

    return payload 
} 

はこのようにそれを呼び出します。

decode(jwtToken: TOKEN) 
+0

ありがとうございます。しかし、私はJWTライブラリを使用することはできません。フレームワークで実装しています。簡単な実装が欲しいです。使用するアンドロイドで String [] split = JWTEncoded.split( "\\。"); 文字列body = getJson(split [1]); Log.d( "JWT_DECODED"、 "Body:" + body); private static String getJson(String strEncoded)throws UnsupportedEncodingException { byte [] decodedBytes = Base64.decode(strEncoded、Base64.URL_SAFE); 新しい文字列を返します(decodedBytes、 "UTF-8")。 } –

+0

私の答えに編集を参照してください。 –

1

私は、このためのソリューションを持っています。

static func getJwtBodyString(tokenstr: String) -> NSString { 

    var segments = tokenstr.components(separatedBy: ".") 
    var base64String = segments[1] 
    print("\(base64String)") 
    let requiredLength = Int(4 * ceil(Float(base64String.characters.count)/4.0)) 
    let nbrPaddings = requiredLength - base64String.characters.count 
    if nbrPaddings > 0 { 
     let padding = String().padding(toLength: nbrPaddings, withPad: "=", startingAt: 0) 
     base64String = base64String.appending(padding) 
    } 
    base64String = base64String.replacingOccurrences(of: "-", with: "+") 
    base64String = base64String.replacingOccurrences(of: "_", with: "/") 
    let decodedData = Data(base64Encoded: base64String, options: Data.Base64DecodingOptions(rawValue: UInt(0))) 
    // var decodedString : String = String(decodedData : nsdata as Data, encoding: String.Encoding.utf8) 

    let base64Decoded: String = String(data: decodedData! as Data, encoding: String.Encoding(rawValue: String.Encoding.utf8.rawValue))! 
    print("\(base64Decoded)") 
    return base64String as NSString 
} 

これは私にとって素晴らしいです。ありがとうございました。

関連する問題