从JWT获取用户ID(JSON Web令牌)

问题描述 投票:1回答:1

我正在使用插件使用api-rest验证WordPress:JWT Authentication for WP REST API

从请求到服务器我得到以下答案:

{
    "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczpcL1wvbWlob3N0Lm9yZ1wvcHJ1ZWJhcyIsImlhdCI6MTU1MzcyNDM4MSwibmJmIjoxNTUzNzI0MzgxLCJleHAiOjE1NTQzMjkxODEsImRhdGEiOnsidXNlciI6eyJpZCI6IjIifX19.rgi5Q2c8RCoHRp-lJiJN8xQaOavn9T_q8cmf8v1-57o",
    "user_email": "[email protected]",
    "user_nicename": "test",
    "user_display_name": "Test"
}

到目前为止一切正常,但我需要知道用户ID。

我已经读过令牌是在base64中编码的,其中是ID。尝试解码,我看到我需要的ID是否存在。

在swift中使用此函数我解码令牌,但我无法获取字典ID。

func decode(_ token: String) -> [String: AnyObject]? {
    let string = token.components(separatedBy: ".")
    let toDecode = string[1] as String


    var stringtoDecode: String = toDecode.replacingOccurrences(of: "-", with: "+") // 62nd char of encoding
    stringtoDecode = stringtoDecode.replacingOccurrences(of: "_", with: "/") // 63rd char of encoding
    switch (stringtoDecode.utf16.count % 4) {
    case 2: stringtoDecode = "\(stringtoDecode)=="
    case 3: stringtoDecode = "\(stringtoDecode)="
    default: // nothing to do stringtoDecode can stay the same
        print("")
    }
    let dataToDecode = Data(base64Encoded: stringtoDecode, options: [])
    let base64DecodedString = NSString(data: dataToDecode!, encoding: String.Encoding.utf8.rawValue)

    var values: [String: AnyObject]?
    if let string = base64DecodedString {
        if let data = string.data(using: String.Encoding.utf8.rawValue, allowLossyConversion: true) {
            values = try! JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.allowFragments) as? [String : AnyObject]
        }
    }
    return values
}

返回此函数的字典是:

["iss": https://myhost.me/test, "exp": 1554235730, "nbf": 1553630930, "iat": 1553630930, "data": {
    user =     {
        id = 2;
    };
}]

如何从这本词典中获取ID?

json swift jwt
1个回答
3
投票

你的代码非常不合时宜。

基本上不要在Swift中使用NS...类,如果有一个本机等价物,并且JSON字典总是值类型([String:Any])。

我建议添加一个Error枚举,让函数可以抛出,用Decodable解码序列化的令牌并在成功时返回Token实例

struct Token : Decodable {
    let data : UserData

    struct UserData  : Decodable {
        let user : User

        struct User  : Decodable {
            let id : String
        }
    }
}

建议您在方法声明中保留参数标签

enum TokenError : Error {
    case invalidJWTFormat, invalidBase64EncodedData
}

func decode(token: String) throws -> Token {
    let components = token.components(separatedBy: ".")
    guard components.count == 3 else { throw TokenError.invalidJWTFormat }
    var decodedString = components[1]
        .replacingOccurrences(of: "-", with: "+")
        .replacingOccurrences(of: "_", with: "/")

    while decodedString.utf16.count % 4 != 0 { 
        decodedString += "=" 
    }
    guard let decodedData = Data(base64Encoded: decodedString) else { throw TokenError.invalidBase64EncodedData }
    return try JSONDecoder().decode(Token.self, from: decodedData)
}

并称之为

do {
   let userID = try decode(token: "eyJ0eXAi.....").data.user.id
} catch { print(error) }
© www.soinside.com 2019 - 2024. All rights reserved.