Swift 中的身份验证与授权:LocalAuthentication、Firebase Auth、Keychain

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

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

开始课程

Swift(iOS/macOS)中的身份验证与授权:工具与库概览



在现代 iOS/macOS 开发中,安全性和访问控制是至关重要的方面。Swift 既提供了用于本地身份验证的内置框架,也提供了与云服务的集成。在本文中,我们将探讨用于实现用户登录、注册和权限验证的主要工具和库。



1. LocalAuthentication — Face ID / Touch ID / Apple Watch



LocalAuthentication 框架允许通过生物识别或设备密码对用户进行身份验证。适用于 iOS 和 macOS。



主要功能:

  • 检查生物识别(Face ID、Touch ID)的可用性
  • 使用上下文进行身份验证(LAContext)
  • 使用设备密码作为备用方案


代码示例:



import LocalAuthentication

func authenticateUser(completion: @escaping (Bool, Error?) -> Void) { let context = LAContext() var error: NSError?

// 检查生物识别是否可用 guard context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &error) else { completion(false, error) return }

// 启动身份验证 context.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, localizedReason: "验证您的身份以访问数据") { success, authError in DispatchQueue.main.async { completion(success, authError) } }}


2. Firebase Authentication — 云身份验证



Firebase Auth 是一个强大的库,支持通过电子邮件/密码、Google、Apple、GitHub 和其他提供商登录。非常适合服务器端应用。



通过 Swift Package Manager 安装:

// 在 Package.swift 中添加:// .package(url: "https://github.com/firebase/firebase-ios-sdk.git", from: "10.0.0")// target: "YourAppTarget", dependencies: ["FirebaseAuth"]


注册新用户:



import FirebaseAuth

func signUp(email: String, password: String) { Auth.auth().createUser(withEmail: email, password: password) { authResult, error in if let error = error { print("注册错误:\\(error.localizedDescription)") return } print("用户已注册:\\(authResult?.user.uid ?? "")") }}


现有用户登录:



func signIn(email: String, password: String) {    Auth.auth().signIn(withEmail: email, password: password) { authResult, error in        if let error = error {            print("登录错误:\\(error.localizedDescription)")            return        }        print("登录成功:\\(authResult?.user.email ?? "")")    }}


3. Keychain Services — 安全存储令牌



要保存 JWT 令牌、密码或密钥,请使用 Keychain。这是 iOS/macOS 的原生机制。



保存和读取示例:



import Security

func saveToKeychain(key: String, data: Data) -> Bool { let query: [String: Any] = [ kSecClass as String: kSecClassGenericPassword, kSecAttrAccount as String: key, kSecValueData as String: data ] SecItemDelete(query as CFDictionary) let status = SecItemAdd(query as CFDictionary, nil) return status == errSecSuccess}

func readFromKeychain(key: String) -> Data? { let query: [String: Any] = [ kSecClass as String: kSecClassGenericPassword, kSecAttrAccount as String: key, kSecReturnData as String: true, kSecMatchLimit as String: kSecMatchLimitOne ] var result: AnyObject? let status = SecItemCopyMatching(query as CFDictionary, &

推荐