如何解码我在 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 中不起作用

如何在 Swift 中使用可解码?

JSON解码器Swift 4.0

Twitter Rest API 不接受 Swift 中令牌的标头

数据映射问题

在 Swift 中解码 JSON API - 重复的结构名称