2017-09-01 172 views
0

我有一個Swift App,它實現了Auth0的Web登錄。在成功登錄後,我會收到一個訪問令牌idToken,我都在本地存儲在我的鑰匙串中。在下次登錄時,我首先檢查訪問令牌(存儲在鑰匙串中)是否仍然有效檢查Auth0 idToken是否已過期

Auth0 
    .authentication() 
    .userInfo(withAccessToken: accessToken) 
    .start { result in 
     switch result { 
     case .success(result: let profile): 

      print("access token still valid") 

成功後無需再次登錄。然而,我遇到的問題是,我的idToken可能已經過期,即使我的訪問令牌仍然有效,導致錯誤,當我請求我的(GraphQL)後端與此idToken。那麼我如何解決這個問題?有沒有辦法檢查,如果我的idToken在Swift中過期了?因爲如果沒有辦法檢查,我將不得不要求登錄,即使可能沒有過期的令牌。這沒有意義。

回答

2

idToken是JSON Web令牌(JWT),所以元數據是可讀的。要查看這看起來像什麼,請將您的令牌粘貼到jwt.io中,然後查看格式是什麼。

例如,藉此JWT:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiZXhwIjoiMTUwNDc1MzQ0NSIsImFkbWluIjp0cnVlfQ.ggeW2vGcdWKNWmICRfTZ8qcBOQlu38DzaO8t_6aNuHQ 

它被分成3個部分:報頭,有效載荷和簽名。到期在有效載荷部分。

我們只需要base64解碼這個。

let jwt = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvbiBTbm93IiwiZXhwIjoiMTUwNDc1MzQ0NSIsImFkbWluIjp0cnVlfQ.aCiqyVAAmHizPshrcdy8jwgHvBg4Diz2YY2e1INjoPg" 

// get the payload part of it 
var payload64 = jwt.components(separatedBy: ".")[1] 

// need to pad the string with = to make it divisible by 4, 
// otherwise Data won't be able to decode it 
while payload64.count % 4 != 0 { 
    payload64 += "=" 
} 

print("base64 encoded payload: \(payload64)") 
let payloadData = Data(base64Encoded: payload64, 
         options:.ignoreUnknownCharacters)! 
let payload = String(data: payloadData, encoding: .utf8)! 
print(payload) 

此打印出:

{"sub":"1234567890","name":"Jon Snow","exp":"1504753445","admin":true} 

exp是您的到期日。你可以通過這個開了一個JSON序列來獲得日期:

let json = try! JSONSerialization.jsonObject(with: payloadData, options: []) as! [String:Any] 
let exp = json["exp"] as! Int 
let expDate = Date(timeIntervalSince1970: TimeInterval(exp)) 
+0

非常感謝,這有助於! – Alienbash