2017-09-01 169 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