Swift中的JWT令牌:JSON Web Tokens完整指南

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

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

开始课程

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                    

推荐