Swift中的JWT令牌(iOS/macOS):完整指南
JSON Web Token(JWT)是一种紧凑的、URL安全的方式,用于在各方之间以JSON格式传输数据。在Apple生态系统(iOS、macOS、watchOS、tvOS)中,JWT广泛用于用户认证、服务间信息交换以及实现单点登录。在本文中,我们将探讨如何在Swift中处理JWT令牌,使用哪些库,以及如何实现从创建到验证的完整流程。
什么是JWT,为什么在iOS/macOS中需要它?
JWT由三部分组成,用点分隔:
- Header — 头部,包含令牌类型和签名算法(例如HS256或RS256)。
- Payload — 有效载荷,包含数据(claims),如用户标识符、过期时间(exp)、签发者(iss)等。
- Signature — 签名,基于header、payload和密钥(或非对称算法的密钥对)创建。
在移动应用中,JWT通常用于:
- 登录后存储用户会话。
- 在客户端和服务器之间传递访问权限。
- 微服务之间的安全数据交换。
Swift中流行的JWT库
有几个经过验证的库可以简化在Apple平台上处理JWT的工作:
- Swift-JWT(IBM) — 最流行的库之一,支持HS256、RS256、ES256等算法,适用于iOS、macOS、Linux。
- JWTDecode(Auth0) — 轻量级库,仅用于解码和验证签名(不创建令牌)。
- Vapor JWT — 用于Swift服务器端(Vapor),但也可用于客户端项目。
- Kitura-CredentialsJWT — IBM Kitura生态系统的一部分。
在本文中,我们将重点介绍Swift-JWT库,因为它最通用且得到积极维护。
通过Swift Package Manager(SPM)安装Swift-JWT
在Package.swift文件中或通过Xcode添加依赖:
// Package.swiftdependencies: [ .package(url: "https://github.com/Kitura/Swift-JWT.git", from: "4.0.0")],targets: [ .target(name: "YourTarget", dependencies: ["SwiftJWT"])]或者在Xcode中:File → Swift Packages → Add Package Dependency,然后输入URL:https://github.com/Kitura/Swift-JWT.git。
使用对称密钥(HS256)创建JWT令牌
我们来看一个使用HS256算法(对称密钥)创建JWT的示例:
import SwiftJWT
// 定义payload的结构体struct MyClaims: Claims { let sub: String let exp: Date let iss: String let admin: Bool}
// 创建有效载荷let claims = MyClaims( sub: "1234567890", exp: Date(timeIntervalSinceNow: 3600), // 令牌有效期为1小时 iss: "pythonlib.ru", admin: true)
// 创建JWT对象var jwt = JWT(claims: claims)
// 指定头部(可选,默认为HS256)let header = Header(kid: "my-key-id")jwt.header = header
// 密钥(在实际项目中,将其存储在Keychain或.env中)let privateKey = "my-secret-key".data(using: .utf8)!
// 签名并获取令牌字符串do { let signedJWT = try jwt.sign(using: .hs256(key: privateKey)) print("创建的JWT:\\(signedJWT)")} catch { print("签名错误: \\(error)")}验证和解码JWT
要验证签名并从令牌中提取数据,请使用:
let jwtString = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwiZXhwIjoxNjg5OTk5OTk5LCJpc3MiOiJweXRob25saWIucnUiLCJhZG1