检查Auth0 idToken是否已过期

时间:2017-09-01 22:32:25

标签: ios swift auth0

我有一个Swift App,它实现了Auth0的Web登录。成功登录后,我会收到访问令牌 idToken ,我本地存储在我的钥匙串中。下次登录时,我首先检查访问令牌(存储在钥匙串中)是否仍然有效

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

             print("access token still valid")

成功后无需再次登录。然而,我遇到的问题是,即使我的访问令牌仍然有效,我的idToken可能已经过期,当我使用此idToken请求我的(GraphQL)后端时会导致错误。那么我该如何解决这个问题呢?有没有办法检查,如果我的idToken已经在Swift中过期了?因为如果没有办法检查,我将不得不要求登录,即使可能没有过期的令牌。那是没有意义的。

1 个答案:

答案 0 :(得分: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))
相关问题