如何解码我在 Swift 中收到 REST API 的 JWT 令牌?
Posted
技术标签:
【中文标题】如何解码我在 Swift 中收到 REST API 的 JWT 令牌?【英文标题】:How can I decode a JWT token which I received a REST API in Swift? 【发布时间】:2020-05-10 00:05:36 【问题描述】:所以我有两个函数 - 一个对用户进行身份验证,以便他可以登录并返回一个 JWT 令牌,第二个函数应验证该令牌以查看用户是否已登录并返回用户 ID用户通过解码令牌。
我的第一个函数有效并提供了一个 JWT 令牌,但我不知道如何制作第二个。我怎样才能做到这一点?
这是我的 JWT 令牌:
"eyJhbGciOiJIUzI1NiJ9.eyJmaXJzdE5hbWUiOiJCb2JWb2VyIiwic3ViIjoiMCIsImV4cCI6MTU4MDY4NjAwNywiYXV0aG9yaXRpZXMiOlsiVVNFUiJdfQ.mrfHVMNIJUssHSNn6tJ-AVVlkuX6A77"
我需要获取一个 Int 的用户 ID。 veryfyToken 函数返回 userID 或 nil。
一些代码:
func verifyToken (to:String, completion: @escaping (Int?)->())
let url = URL(string: "http://localhost:8083/verifyToken")!
let json: [String: String] = ["token":to]
let jsonData = try? JSONSerialization.data(withJSONObject: json as Any)
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.httpBody = jsonData
print("HTTPBODY:::",request.httpBody as Any)
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
request.addValue("application/json", forHTTPHeaderField: "Accept")
【问题讨论】:
【参考方案1】:您应该使用库来验证和解码您的令牌。 jwt.io 站点列出了包括 Swift 在内的所有平台的受信任库。
截至今天,列出的图书馆是:
https://github.com/kylef/JSONWebToken.swift https://github.com/vapor/jwt https://github.com/Wstunes/SwiftyJWT https://github.com/IBM-Swift/Swift-JWT如果您使用 JSONWebToken,获取声明的代码如下所示:
do
let claims: ClaimSet = try JWT.decode("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.e30.2_8pWJfyPup0YwOXK7g9Dn0cF1E3pdn299t4hSeJy5w", algorithm: .hs256("secret".data(using: .utf8)!))
print(claims)
catch
print("Failed to decode JWT: \(error)")
【讨论】:
有没有办法在没有库的情况下做到这一点? 您可以查看库的代码以了解他们是如何做到的,但在安全性方面,您可能应该坚持使用库。 @temrot 解码非常简单,有 3 个 base64url 编码的字符串由.
连接。第二部分是有效载荷。所以 base64url 解码第二部分,你会得到一个包含数据的 JSON。以上是关于如何解码我在 Swift 中收到 REST API 的 JWT 令牌?的主要内容,如果未能解决你的问题,请参考以下文章
当应用程序关闭时,Rest Api Firebase 通知在 Swift 4 中不起作用