OAuth 2.0 和 JWT 授权在 Swift 上:面向新手的完整指南

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

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

开始课程

引言:为什么移动应用需要授权?

现代 iOS 应用很少独立运行。它们与服务器通信,发送数据,获取个性化内容。但服务器如何判断请求是否来自声称的用户?这时 OAuth 2.0 和 JWT(JSON Web Token) 就派上了用场。这不仅仅是时髦的缩写,而是大多数现代 API(Google、Facebook、GitHub、你自己的后端)运行所依赖的安全标准。

在本文中,我们将分析 OAuth 2.0 和 JWT 在 Swift 上的工作原理。您将了解它们的区别、如何正确实现它们以及新手可能遇到的陷阱。我们将编写用于获取、存储和刷新令牌的代码。开始吧!



1. 基础:OAuth 2.0 和 JWT — 有什么区别?

许多人混淆这两个概念。实际上,它们是不同抽象层次的东西。

  • OAuth 2.0 — 是一个授权协议。它描述了应用(客户端)如何在不传递登录名和密码的情况下,访问用户在第三方服务器上的资源(例如,其在 Google 中的照片)。主要思想是颁发临时访问令牌。
  • JWT — 是一种令牌格式。它是一个紧凑的、URL 安全的字符串,包含 JSON 数据(例如,用户 ID、角色、有效期)和签名。JWT 经常在 OAuth 2.0 中用作 access token,但也可以单独使用。

一个简单的类比:OAuth 2.0 是发放体育场通行证的规则,而 JWT 是带有您照片和印章的塑料通行证本身。

在典型的 iOS 应用场景中:

  1. 打开浏览器通过 OAuth 提供商(Google、Apple ID、自己的服务器)登录。
  2. 获取 authorization code。
  3. 将代码兑换为 access token(通常是 JWT 格式)和 refresh token。
  4. 使用 access token 向 API 发起请求。
  5. 当 access token 过期时,使用 refresh token 获取新的 access token。


2. JWT 令牌的结构

JWT 由三部分组成,用点分隔:

header.payload.signature

解码后的 JWT 示例:

// Header (头部){  "alg": "HS256",  "typ": "JWT"}// Payload (负载){  "sub": "1234567890",  "name": "伊万·彼得罗夫",  "iat": 1516239022,  "exp": 1516242622}// Signature (签名) - 由服务器创建

重要提示: JWT 的 Payload 未加密,仅经过 Base64 编码。任何人都可以读取它。保密性由签名保证——如果服务器发现签名不匹配,它将拒绝该令牌。因此,切勿在 JWT 中存储密码或机密数据。



3. 在 Swift 上实现 OAuth 2.0 和 JWT

现在进入实践环节。我们将编写一个用于处理授权的类。为简单起见,我们将使用内置的 URLSession,尽管在实际项目中经常使用 Alamofire 或 SwiftUI + async/await。



3.1. 数据模型

struct AuthResponse: Codable {    let accessToken: String    let refreshToken: String?    let expiresIn: Int        enum CodingKeys: String, CodingKey {        case accessToken = "access_token"        case refreshToken = "refresh_token"        case expiresIn = "expires_in"    }}

struct UserProfile: Codable { let id: String let name: String let email: String}


3.2. 授权服务

让我们创建一个 AuthService 类,它将负责获取和刷新令牌。请注意:在实际应用中,URL 和 clientSecret 应安全存储(例如,在 Keychain 中或通过配置服务器)。

class AuthService {    static let shared = A                

博客

书籍推荐