获取 Apple 授权登录的 Token

获取 Apple 授权登录的 Token

在 iOS 应用中集成 Apple 授权登录功能,可以通过以下步骤获取用户的身份验证 Token(ID Token 和授权码)。Apple 登录基于 OAuth 2.0 和 OpenID Connect 协议。

1. 配置项目

在 Xcode 中启用 Apple 登录功能:

  • 打开项目设置,选择 Signing & Capabilities 标签页。
  • 点击 + Capability,添加 Sign in with Apple
  • 确保应用的 Bundle ID 在 Apple Developer 后台已正确配置。
2. 导入 AuthenticationServices 框架

在需要使用 Apple 登录的代码文件中导入框架:

swift 复制代码
import AuthenticationServices
3. 实现登录请求

创建一个 ASAuthorizationAppleIDProvider 实例并配置请求:

swift 复制代码
let provider = ASAuthorizationAppleIDProvider()
let request = provider.createRequest()
request.requestedScopes = [.fullName, .email] // 请求用户姓名和邮箱
4. 处理授权响应

创建 ASAuthorizationController 并设置代理处理回调:

swift 复制代码
let controller = ASAuthorizationController(authorizationRequests: [request])
controller.delegate = self
controller.presentationContextProvider = self
controller.performRequests()
5. 实现代理方法

通过 ASAuthorizationControllerDelegate 处理授权结果:

swift 复制代码
extension ViewController: ASAuthorizationControllerDelegate {
    func authorizationController(controller: ASAuthorizationController, didCompleteWithAuthorization authorization: ASAuthorization) {
        if let credential = authorization.credential as? ASAuthorizationAppleIDCredential {
            let userIdentifier = credential.user
            let fullName = credential.fullName
            let email = credential.email
            
            // 获取 ID Token(JWT 格式)
            if let idToken = credential.identityToken {
                let idTokenString = String(data: idToken, encoding: .utf8)
                print("ID Token: \(idTokenString ?? "")")
            }
            
            // 获取授权码(用于服务器验证)
            if let authCode = credential.authorizationCode {
                let authCodeString = String(data: authCode, encoding: .utf8)
                print("Authorization Code: \(authCodeString ?? "")")
            }
        }
    }
    
    func authorizationController(controller: ASAuthorizationController, didCompleteWithError error: Error) {
        print("Authorization failed: \(error.localizedDescription)")
    }
}
6. 实现展示上下文代理

设置展示登录界面的窗口:

swift 复制代码
extension ViewController: ASAuthorizationControllerPresentationContextProviding {
    func presentationAnchor(for controller: ASAuthorizationController) -> ASPresentationAnchor {
        return view.window!
    }
}

注意事项

  • ID Token:包含用户身份信息的 JWT 令牌,可用于本地验证或发送到服务器。
  • 授权码:短期有效的代码,需发送到服务器换取访问令牌。
  • 用户状态检查 :可通过 ASAuthorizationAppleIDProvider.getCredentialState(forUserID:) 检查用户是否仍处于登录状态。
  • 密钥和配置:服务器端验证需配置 Apple 的公钥和应用的 Service ID。

以上步骤实现了在 iOS 应用中获取 Apple 登录的 Token 和用户基本信息。

相关推荐
@大迁世界1 天前
14个你现在必须关闭的 iOS 26 设置,不然手机很快被它榨干
macos·ios·智能手机·objective-c·cocoa
四眼蒙面侠1 天前
深入 SwiftWork(第 0 篇):用 SwiftUI 构建一个 Agent 可视化工作台
swift·openagentsdk
YJlio1 天前
10.2.8 以其他账户运行服务(Running services in alternate accounts):为什么“把服务切到某个用户账号下运行”,本质上是在改变服务的整个安全上下文?
python·安全·ios·机器人·django·iphone·7-zip
pop_xiaoli1 天前
【iOS】KVC与KVO
笔记·macos·ios·objective-c·cocoa
90后的晨仔1 天前
《swiftUI进阶 第10章:现代状态管理(iOS 17+)》
ios
sakiko_2 天前
UIKit学习笔记4-使用UITableView制作滚动视图
笔记·学习·ios·swift·uikit
小锋学长生活大爆炸2 天前
【开源软件】这次iPhone也是用上Claw了 | PhoneClaw
ios·开源软件·iphone·claw
SameX2 天前
独立开发一个把走过的路变成 km² 的 App,聊聊 25m 网格和后台 GPS 的坑
ios
XD7429716362 天前
科技早报晚报|2026年4月30日:Agent 安全壳、浏览器 iOS 测试台与可穿戴数据 API,今天更值得看的 3 个技术机会
科技·ios·开源项目·科技新闻·开发者工具
北京自在科技2 天前
Find Hub App 小更新
android·ios·安卓·findmy·airtag