我有一个 Swift 应用程序,它实现了 Auth0 的网络登录。成功登录后,我会收到一个访问令牌和idToken,它们都本地存储在我的钥匙串中。下次登录时,我首先检查访问令牌(存储在钥匙串中)是否仍然有效
Auth0
.authentication()
.userInfo(withAccessToken: accessToken)
.start { result in
switch result {
case .success(result: let profile):
print("access token still valid")
Run Code Online (Sandbox Code Playgroud)
成功后不必再次登录。然而,我遇到的问题是,即使我的访问令牌仍然有效,我的 idToken 可能已经过期,这会导致在我使用此 idToken 请求我的(GraphQL)后端时出错。那么我该如何解决这个问题?有没有办法检查我的 idToken 在 Swift 中是否已过期?因为如果没有办法检查,我将不得不要求登录,即使令牌可能没有过期。那没有意义。
Ben*_*man 13
AnidToken是 JSON Web Token (JWT),因此元数据是可读的。要查看它的样子,请将您的令牌粘贴到 jwt.io 并查看格式。
以这个 JWT 为例:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiZXhwIjoiMTUwNDc1MzQ0NSIsImFkbWluIjp0cnVlfQ.ggeW2vGcdWKNWmICRfTZ8qcBOQlu38DzaO8t_6aNuHQ
Run Code Online (Sandbox Code Playgroud)
它分为 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)
Run Code Online (Sandbox Code Playgroud)
这打印出来:
{"sub":"1234567890","name":"Jon Snow","exp":"1504753445","admin":true}
Run Code Online (Sandbox Code Playgroud)
该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))
let isValid = expDate.compare(Date()) == .orderedDescending
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1427 次 |
| 最近记录: |