获取 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 和用户基本信息。