Swift中的JWT令牌:在iOS/macOS上使用JSON Web Token

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

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)。服务器使用私钥签名令牌,客户端使用公钥验证:



//                    

推荐