Swift中的JWT令牌(iOS/macOS):完整指南
JSON Web Token(JWT)是一种基于JSON的开放标准(RFC 7519),用于创建访问令牌。JWT广泛应用于客户端与服务器之间的身份验证和信息交换。在Apple生态系统(iOS、macOS、watchOS、tvOS)中,处理JWT对于开发与REST API、微服务或任何需要安全数据传输的系统交互的应用程序至关重要。
本文介绍SwiftJWT库——Swift语言中最流行且积极维护的JWT处理解决方案。我们将讨论安装、基本操作(创建、签名、验证)以及高级使用场景。
什么是SwiftJWT?
SwiftJWT是一个轻量级的原生Swift库,它允许您:
- 使用任意声明(claims)创建JWT
- 使用算法签名令牌:HS256、HS384、HS512(对称)和RS256、RS384、RS512(基于RSA的非对称)
- 验证签名和令牌过期时间
- 在不验证签名的情况下解码payload(例如,在客户端显示信息)
- 处理自定义数据和标准字段(iss、sub、exp、iat等)
该库完全用Swift编写,不需要外部依赖(除了Foundation和Security),并且兼容Swift Package Manager(SPM)、CocoaPods和Carthage。
通过Swift Package Manager安装
通过Xcode或直接在Package.swift中将包添加到您的项目:
// Package.swiftdependencies: [ .package(url: "https://github.com/Kitura/Swift-JWT.git", from: "4.0.0")],targets: [ .target(name: "YourTarget", dependencies: ["SwiftJWT"])]JWT的基本操作
1. 创建和签名令牌(HS256)
最简单的情况是使用对称密钥创建令牌:
import SwiftJWT
// 1. 定义Claims结构struct MyClaims: Claims { let iss: String let sub: String let exp: Date let admin: Bool let customData: String}
// 2. 创建Claims实例let claims = MyClaims( iss: "com.yourcompany.app", sub: "user123", exp: Date(timeIntervalSinceNow: 3600), // +1小时 admin: true, customData: "some_value")
// 3. 定义密钥(对于HS256——任意字符串)let secretKey = "your-256-bit-secret".data(using: .utf8)!
// 4. 创建JWTvar jwt = JWT(claims: claims)let signedJWT = try jwt.sign(using: .hs256(key: secretKey))print("创建的令牌:\\(signedJWT)")2. 验证和解码令牌
// 验证签名和过期时间let receivedToken = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
do { // 验证并解码 let verifiedJWT = try JWT<MyClaims>.verify(token: receivedToken, using: .hs256(key: secretKey)) print("令牌有效。Claims: \\(verifiedJWT.claims)") // 检查特定字段 if verifiedJWT.claims.admin { print("用户是管理员") }} catch { print("验证错误:\\(error)") // 可能的错误:expiredToken, invalidSignature, malformedToken}
// 无需验证的解码(仅用于读取数据)if let payload = try? JWTDecoder().decodePayload(from: receivedToken) { print("Payload(未验证):\\(payload)")}3. 使用非对称密钥(RS256)
对于生产环境,建议使用非对称加密(RSA)。服务器使用私钥签名令牌,客户端使用公钥验证:
//