在 WWDC 2019 上,苹果也想在第三方登录服务这块“蛋糕”上分一杯羹,给我们带来了 “Sign In with Apple”(使用苹果账号登录)。这似乎也是水到渠成的事,因为几乎所有的 iOS/macOS 设备都会登录 Apple ID,而且近两年来,苹果强制对所有的 Apple ID 推行 Two-Factor Authentication(2FA,双重因子验证),大大提高了苹果账号的安全性,减少了盗号风险。
因此,我们可以畅想在不久的将来,在苹果设备上,只要登录了 Apple ID,就可以直接登录所有的 App,是不是很方便?但这同时也是黑客们的福音啊...👻
2. 概览
The fast, easy way to sign in to apps and websites.
通过 Sign In with Apple,用户可以轻松登录开发者的应用和网站,开发者可以获取到以下三个信息用于创建自己的账号体系(下一节会细讲):
首先,在你 App 的登录页面添加一个 “Sign In with Apple” 按钮 ASAuthorizationAppleIDButton,并添加按钮点击响应事件,代码大致如下:
// Add “Sign In with Apple” button to your login view funcsetupProviderLoginView() { let authorizationButton = ASAuthorizationAppleIDButton() authorizationButton.addTarget(self, action: #selector(handleAuthorizationAppleIDButtonPress), for: .touchUpInside) self.loginProviderStackView.addArrangedSubview(authorizationButton) }
let userIdentifier = appleIDCredential.user let fullName = appleIDCredential.fullName let email = appleIDCredential.email let realUserStatus = credential.realUserStatus
let identityToken = credential.identityToken let authCode = credential.authorizationCode
User ID: Unique, stable, team-scoped user ID,苹果用户唯一标识符,该值在同一个开发者账号下的所有 App 下是一样的,开发者可以用该唯一标识符与自己后台系统的账号体系绑定起来(这与国内的微信、QQ、微博等第三方登录流程基本一致)。
Verification data: Identity token, code,验证数据,用于传给开发者后台服务器,然后开发者服务器再向苹果的身份验证服务端验证本次授权登录请求数据的有效性和真实性,详见 Sign In with Apple REST API。如果验证成功,可以根据 userIdentifier 判断账号是否已存在,若存在,则返回自己账号系统的登录态,若不存在,则创建一个新的账号,并返回对应的登录态给 App。
let appleIDProvider = ASAuthorizationAppleIDProvider() appleIDProvider.getCredentialState(forUserID: "currentUserIdentifier") { (credentialState, error) in switch credentialState { case .authorized: // The Apple ID credential is valid break case .revoked: // Apple ID Credential revoked, handle unlink break case .notFound: // Credential not found, show login UI break default: break } }
苹果称,该 API 的速度非常快,我们可以在 App 每次启动时调用,然后根据结果做相应的处理:
authorized:登录状态有效;
revoked:上次使用苹果账号登录的凭据已被移除,需退出解除绑定并重新引导使用苹果登录;
notFound:未登录,直接显示开发者 App 的登录页面。
此外,苹果也提供了通知的方式来监听,在 App 使用过程中,当苹果账号发生变化时做相应的处理:
// Register for revocation notification let center = NotificationCenter.default let name = NSNotification.Name.ASAuthorizationAppleIDProviderCredentialRevoked let observer = center.addObserver(forName: name, object: nil, queue: nil) { (Notification) in // Sign the user out, optionally guide them to sign in again }
快速登录已有账户
如果一个 Apple ID 之前已在 App 中授权登录过了,此时点击 “Sign In with Apple” 会直接显示如下页面:
/// Prompts the user if an existing iCloud Keychain credential or Apple ID credential is found. funcperformExistingAccountSetupFlows() { // Prepare requests for both Apple ID and password providers. let requests = [ASAuthorizationAppleIDProvider().createRequest(), ASAuthorizationPasswordProvider().createRequest()]
// Create an authorization controller with the given requests. let authorizationController = ASAuthorizationController(authorizationRequests: requests) authorizationController.delegate = self authorizationController.presentationContextProvider = self authorizationController.performRequests() }
然后在回调方法中进行判断:
funcauthorizationController(controller _: ASAuthorizationController, didCompleteWithAuthorization authorization: ASAuthorization) { switch authorization.credential { caselet credential asASAuthorizationAppleIDCredential: let userIdentifier = credential.user // Sign the user in using the Apple ID credential caselet credential asASPasswordCredential: // Sign the user in using their existing password credential default: break } }
补充
App 要集成苹果账号登录,必须在 Xcode 工程的 Signing & Capabilities tab 中添加 “Sign In with Apple” 能力,需登录相应的开发者账号;
调试时,必须使用运行最新系统版本的真机设备,且设备上登录的 Apple ID 必须开启 2FA 双重验证;
上述示例代码完整的 Demo,详见这里:Adding the Sign In with Apple Flow to Your App
4. 跨平台 - JavaScript SDK
“Sign In with Apple” 最大的杀手锏在于跨平台,除了苹果自己生态内的系统,苹果还提供了 JavaScript SDK,使得在 Web 应用中也能很方便地使用该服务。因为 Web 本身是跨平台的,所以理论上在 Windows 或者 Android 操作系统上也可以使用苹果账号登录啦~
iOS, macOS, tvOS, and watchOS: Native API
Web / Windows / Android: Javascript SDK
它具有如下 3 个特性:
Simple browser-based login - 点击 Web 页面上的苹果登录按钮,跳转到苹果网站进行登录,然后苹果会把登录结果回调给开发者填写的 redirectUri;
Similar to native API - JS API 与原生 API 类似,简单易用;
Native experience when using Safari - 如果用户使用 Safari 浏览器访问 Web,则会默认调用 Native API 进行授权登录操作;
在最近更新的苹果应用商店审核指南 Updates to the App Store Review Guidelines 中,有如下一段话:
Sign In with Apple will be available for beta testing this summer. It will be required as an option for users in apps that support third-party sign-in when it is commercially available later this year.
也就是说,当 “Sign In with Apple” 服务正式上线以后,所有已接入其它第三方登录的 App 也必须接入苹果账号登录,否则可能就不给过(当然,那些只有自己账号体系登录的 App 就不用担心了),苹果爸爸还真是强势,所以,适配工作赶快行动起来吧~
Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。