Sign In with Apple - 使用苹果账号登录你的应用


编辑:老峰,作者:KANGZUBIN 来源:小专栏《WWDC19 内参》

苹果在 9 月 12 号更新了审核指南,加入 4.8 Sign in with Apple 一条,要求所有使用 第三方登录 的 App,都 必须接入 Sign in with Apple。符合以下条件的 App,可以不接入:

• 使用自建账户和登录系统;

• 要求用户使用现有的教育或企业账户登录的教育、企业或商业类应用;

• 使用政府或行业支持的公民身份识别系统或电子 ID 来验证用户;

• 应用特定于第三方服务,用户需要使用邮箱、社交媒体或其它第三方账户才能访问其内容的应用;

已经上架的 App 需在 2020 年 4 月 前完成接入工作,新上架 App(如果支持三方登录)必须接入,负责将被拒。

1. 引言

对于绝大部分应用,通常都会有自己的账号体系,但为了避免用户经常忘记账号密码,那些中小型 App 一般都会接入来自大厂的第三方登录 SDK,如在国外常见的有使用 Google、Facebook、Twitter、GitHub 等账号登录;而在国内,近两年几乎所有的 App 都会推荐首先使用手机号+短信验证码的方式注册/登录,同时也会接入像微信、QQ、微博、支付宝等超级 App 的登录 SDK,便于用户实现一键登录,如下图:

在 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,用户可以轻松登录开发者的应用和网站,开发者可以获取到以下三个信息用于创建自己的账号体系(下一节会细讲):

  • ID

  • Full name

  • Verified email address

它具有如下几个特性,详见这里:

  • 简化账号的创建和登录流程,无缝跨设备使用;

  • 开发者可以获取到已验证过的邮箱作为登录账号或者与用户进行通信(注:用户可以选择隐藏真实邮箱,并使用苹果提供的虚拟邮箱进行授权);

  • 系统内置的安全性:2FA 双重验证(Face ID 或 Touch ID),从此登录不再需要密码;

  • 尊重用户隐私:开发者仅仅可获取到用户的姓名和邮箱,同时苹果不会收集任何用户与应用之间使用数据;

  • 反欺诈:使用设备上的机器学习等技术和其他信息,帮助开发者判断一个账号是否为真实用户;

最重要的是,它是跨平台的!!!

3. 如何集成

在你的 App 中集成 “Sign In with Apple” 服务,大致只需要以下 4 步骤:

4.1 添加登录按钮

首先,在你 App 的登录页面添加一个 “Sign In with Apple” 按钮 ASAuthorizationAppleIDButton,并添加按钮点击响应事件,代码大致如下:

// Add “Sign In with Apple” button to your login viewfunc setupProviderLoginView() {let authorizationButton = ASAuthorizationAppleIDButton()authorizationButton.addTarget(self, action: #selector(handleAuthorizationAppleIDButtonPress), for: .touchUpInside)self.loginProviderStackView.addArrangedSubview(authorizationButton)}

当然你也可以自定义苹果登录按钮的样式,样式要求详见这个文档:Human Interface Guidelines

最终的登录页面效果图参考如下:

4.2 发起授权请求

在上述按钮点击事件 handleAuthorizationAppleIDButtonPress 中配置需要获取的数据权限范围(例如:用户名、邮箱等),然后设置回调代理,并发起登录授权请求,代码如下:

// Configure request, setup delegates and perform authorization request@objc func handleAuthorizationAppleIDButtonPress() {let appleIDProvider = ASAuthorizationAppleIDProvider()let request = appleIDProvider.createRequest()request.requestedScopes = [.fullName, .email]let authorizationController = ASAuthorizationController(authorizationRequests: [request])authorizationController.delegate = selfauthorizationController.presentationContextProvider = selfauthorizationController.performRequests()}

当用户点击 “Sign In with Apple” 按钮后,就会显示苹果登录授权确认页面,如下图所示:

在该页面,用户可以选择是否给你返回他的名字和真实邮箱,当然用户也可以选择隐藏自己的邮箱,此时开发者会得到一个虚拟的用户邮箱地址(此邮箱收到的邮件会转发到用户真实的邮箱上)。当用户点击 “Continue” 按钮后,会进行 “Touch ID” 或者 “Face ID” 双重验证,然后回调数据给开发者。

4.3 处理回调,服务端验证结果

我们需要在代码中实现两个代理回调 ASAuthorizationControllerDelegateASAuthorizationControllerPresentationContextProviding 分别用于处理授权登录成功和失败、以及提供用于展示授权页面的 Window,代码如下:

/// MARK: ASAuthorizationControllerDelegatefunc authorizationController(controller: ASAuthorizationController, didCompleteWithAuthorization authorization: ASAuthorization) {if let appleIDCredential = authorization.credential as? ASAuthorizationAppleIDCredential {let userIdentifier = appleIDCredential.userlet fullName = appleIDCredential.fullNamelet email = appleIDCredential.emaillet realUserStatus = credential.realUserStatuslet identityToken = credential.identityTokenlet authCode = credential.authorizationCode// Create account in your system}}func authorizationController(controller: ASAuthorizationController, didCompleteWithError error: Error) {// Handle error.}/// MARK: ASAuthorizationControllerPresentationContextProvidingfunc presentationAnchor(for controller: ASAuthorizationController) -> ASPresentationAnchor {return self.view.window!}

在授权成功回调中,我们可以拿到以下几类数据:

  • User ID: Unique, stable, team-scoped user ID,苹果用户唯一标识符,该值在同一个开发者账号下的所有 App 下是一样的,开发者可以用该唯一标识符与自己后台系统的账号体系绑定起来(这与国内的微信、QQ、微博等第三方登录流程基本一致)。

  • Verification data: Identity token, code,验证数据,用于传给开发者后台服务器,然后开发者服务器再向苹果的身份验证服务端验证本次授权登录请求数据的有效性和真实性,详见 Sign In with Apple REST API。如果验证成功,可以根据 userIdentifier 判断账号是否已存在,若存在,则返回自己账号系统的登录态,若不存在,则创建一个新的账号,并返回对应的登录态给 App。

  • Account information: Name, verified email,苹果用户信息,包括全名、邮箱等。

  • Real user indicator: High confidence indicator that likely real user,用于判断当前登录的苹果账号是否是一个真实用户,取值有:unsupportedunknownlikelyReal

4.4 处理苹果账号会话发生变化

当开发者的 App 通过苹果账号登录后,iOS/macOS 设备上登录的 Apple ID 发生变化时,例如:

  • 设备上的 Apple ID 退出登录、切换新的账号登录;

  • 用户在设置页面禁止 App 使用苹果账号登录,如下图:

此时,也需要通知到 App 做账号登出处理。因此,我们可以 App 启动时,调用 ASAuthorizationAppleIDProvider 的 getCredentialState 方法,传入当前用户的 UserIdentifier 进行判断:

let appleIDProvider = ASAuthorizationAppleIDProvider()appleIDProvider.getCredentialState(forUserID: "currentUserIdentifier") { (credentialState, error) inswitch credentialState {case .authorized:// The Apple ID credential is validbreakcase .revoked:// Apple ID Credential revoked, handle unlinkbreakcase .notFound:// Credential not found, show login UIbreakdefault:break}}

苹果称,该 API 的速度非常快,我们可以在 App 每次启动时调用,然后根据结果做相应的处理:

  • authorized:登录状态有效;

  • revoked:上次使用苹果账号登录的凭据已被移除,需退出解除绑定并重新引导使用苹果登录;

  • notFound:未登录,直接显示开发者 App 的登录页面。

此外,苹果也提供了通知的方式来监听,在 App 使用过程中,当苹果账号发生变化时做相应的处理:

// Register for revocation notificationlet center = NotificationCenter.defaultlet name = NSNotification.Name.ASAuthorizationAppleIDProviderCredentialRevokedlet observer = center.addObserver(forName: name, object: nil, queue: nil) { (Notification) in// Sign the user out, optionally guide them to sign in again}

4.5 快速登录已有账户

如果一个 Apple ID 之前已在 App 中授权登录过了,此时点击 “Sign In with Apple” 会直接显示如下页面:

或者 App 上次用自己的账号/密码登录后保存在 Keychain 中,此时可以在登录页面直接请求读取密码进行自动填充:

对于读取 Keychain 中保存的密码,苹果提供了与授权登录类似的 API,我们可以在登录页面的 viewDidAppear 方法中执行代码如下:

/// Prompts the user if an existing iCloud Keychain credential or Apple ID credential is found.func performExistingAccountSetupFlows() {// 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 = selfauthorizationController.presentationContextProvider = selfauthorizationController.performRequests()}

然后在回调方法中进行判断:

func authorizationController(controller _: ASAuthorizationController, didCompleteWithAuthorization authorization: ASAuthorization) {switch authorization.credential {case let credential as ASAuthorizationAppleIDCredential:let userIdentifier = credential.user// Sign the user in using the Apple ID credentialcase let credential as ASPasswordCredential:// Sign the user in using their existing password credentialdefault: 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 进行授权登录操作;

JavaScript SDK 的使用步骤大致如下:

  • Include:引入 SDK 依赖

<script src="https://appleid.cdn-apple.com/appleauth/static/jsapi/appleid/1/en_US/appleid.auth.js">
  • Button:添加苹果登录按钮,并自定义样式

<div id="appleid-signin"></div>
  • Configure:登录信息配置,设置回调 URL

AppleID.auth.init({clientId : 'com.example.webapp',scope : 'name email',redirectURI : 'https://example.com/redirectUri',state : 'state'});
  • Result:服务端处理登录回调结果

POST /redirectUri

关于苹果登录的 JS SDK 更详细的内容,请参考这里:Sign In with Apple JS

5. App Store 审核

在最近更新的苹果应用商店审核指南 Updates to the App Store Review Guidelines 中,有如下一段话:

We’ve updated the App Store Review Guidelines to provide criteria for when apps are required to use Sign in with Apple. Starting today, new apps submitted to the App Store must follow these guidelines. Existing apps and app updates must follow them by April 2020. We’ve also provided new guidelines for using Sign in with Apple on the web and other platforms.

也就是说,所有已接入其它第三方登录的 App 也必须在 2020 年 4 月前完成接入工作,而新上架提交的 App 必须完成接入工作,否则可能就不给过(当然,那些只有自己账号体系登录的 App 就不用担心了),苹果爸爸还真是强势,所以,适配工作赶快行动起来吧~

推荐阅读:

  1. 深入理解 Objective-C:Category

  2. 如何实现一个手帐 App

  3. iOS 13 Data Source 新特性:基于 Diffable 实现局部刷新

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/19030.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IOS企业应用出现无法验证,需要网络连接以在这台iPad上验证。接入互联网并重试

这两天出现一个很奇怪的现象&#xff0c;IOS 13.5.1版本以上的系统安装应用时企业APP无法信任&#xff0c;但是IOS 13.5.1版本以下又可以信任。然后我做了以下操作之后就可以正常安装和信任了。 1.更换新的Development证书&#xff0c;原先的Development证书类型是Development&…

关于ipad:无法验证服务器身份

ipad 连接网络后&#xff0c;有时候会冒出这个弹窗&#xff0c;并且关掉后仍继续弹出 可以尝试以下几种方法&#xff1a;&#xff08;我是用③解决的&#xff09; ①. 确保你的iPad连接的是稳定的网络。有时候网络连接不稳定会导致无法验证服务器身份。 我们学校这个校园网…

Mirai登陆QQ的登陆验证过程

1.配置好一切,启动mirai进行登陆 设置好Bot的账号密码,启动项目 2.弹出如下弹窗,提示我们需要进行滑块验证 1.复制红框内的URL到浏览器打开 2.记得在加载完后按f12打开控制台 3.控制台切换到network/网络 3. 拖动滑动窗口,正确进行验证,观察控制台的响应 1.找到cap_union_new_…

iOS接入Google登录

目录 1.在Google Cloud后台配置客户端ID 2.iOS配置URL Types​编辑 3.代码实操 1.在Google Cloud后台配置客户端ID 首先要在 Google Cloud 中创建一个项目。新创建的Project需要先配置同意屏幕。一共有4步骤需要配置。 1.OAuth 同意屏幕 User Type选择"外部"进行创…

「超全!」谷歌大神 LeetCode 刷题笔记 PDF 分享

这是一本面向有C++编程基础,但缺乏刷题经验的读者的教科书和工具书(不适合完全的编程小白喔);同时,这是一本总结了15种常见类型题,50种细分类型题,101道题解的LeetCode刷题指南~ 作者高畅是谷歌无人车部门(Waymo)的工程师,从事计算机视觉和机器学习方向。 他在美国…

《LeetCode》—— 哈希

今天刷题讲解的主要讲的是关于——哈希这个知识点的题目讲解。 目录 &#xff08;一&#xff09;缺失的第一个正整数 &#xff08;二&#xff09;数组中只出现一次的两个数字 1、直接法 2、哈希 &#xff08;三&#xff09;直线上最多的点数 &#xff08;一&#xff09;缺…

文心一言 VS 讯飞星火 VS chatgpt (53)-- 算法导论6.2 5题

五、MAX-HEAPIFY的代码效率较高&#xff0c;但第 10 行中的递归调用可能例外&#xff0c;它可能使某些编译器产生低效的代码。请用循环控制结构取代递归&#xff0c;重写 MAX-HEAPIFY代码。 文心一言&#xff1a; 以下是使用循环控制结构取代递归调用的 MAX-HEAPIFY 代码&…

【Day18】LeetCode算法刷题[1694. 重新格式化电话号码 ] [202.快乐数]

刷题打卡&#xff0c;第十八天 题目一、1694. 重新格式化电话号码题目二、202.快乐数 题目一、1694. 重新格式化电话号码 原题链接&#xff1a;1694. 重新格式化电话号码 题目描述&#xff1a; 给你一个字符串形式的电话号码 number 。number 由数字、空格 、和破折号 - 组…

List解答LeetCode杨辉三角

作者&#xff1a;月亮嚼成星~ 博客主页&#xff1a;月亮嚼成星~的博客主页 专栏&#xff1a;数据结构与算法 工欲善其事必先利其器&#xff0c;给大家介绍一款超牛的斩获大厂offer利器——牛客网 点击免费注册和我一起刷题吧 目录 了解杨辉三角 题目要求&#xff1a; 解答思…

张朝阳开课手推E=mc²,李永乐现场狂做笔记!CEO当太久都忘了他是MIT物理博士...

晓查 萧箫 明敏 鱼羊 发自 凹非寺量子位 | 公众号 QbitAI 张朝阳当物理老师还真是当上瘾了。 刚刚直接完成了一场线下课&#xff0c;当场手推质能方程&#xff0c;一整面黑板墙都差点没盛下。 这个姿势&#xff0c;是不是有你大物老师内范儿了&#xff08;手动狗头&#xff09;…

文心一言 VS 讯飞星火 VS chatgpt (25)-- 算法导论4.2 7题

七、设计算法&#xff0c;仅使用三次实数乘法即可完成复数 abi和cdi 相乘。算法需接收a、b、c和d 为输入&#xff0c;分别生成实部 ac-bd 和虚部adbc。 文心一言&#xff1a; 可以使用如下算法来计算复数 abi 和 cdi 的积&#xff0c;且只需进行三次实数乘法&#xff1a; 1.…

文心一言 VS 讯飞星火 VS chatgpt (24)-- 算法导论4.2 6题

六、用Strassen 算法作为子进程来进行一个 knn 矩阵和一个nkn 矩阵相乘&#xff0c;最快需要花费多长时间?对两个输入矩阵规模互换的情况&#xff0c;回答相同的问题。 文心一言&#xff1a; Strassen 算法是一种用于矩阵乘法的分治算法&#xff0c;它将原始的矩阵分解为较小…

文心一言 VS 讯飞星火 VS chatgpt (41)-- 算法导论5.4 5题

五、在大小为n的集合中&#xff0c;一个k字符串构成一个k排列的概率是多少?这个问题和生日悖论有什么关系? 文心一言&#xff1a; 在大小为n的集合中&#xff0c;一个k字符串构成一个k排列的概率是1/k!&#xff0c;这是由于排列的总数是k!&#xff0c;而每个字符串被选中的…

文心一言 VS 讯飞星火 VS chatgpt (18)-- 算法导论4.1 5题

五、使用如下思想为最大子数组问题设计一个非递归的、线性时间的算法。从数组的左边界开始&#xff0c;由左至右处理&#xff0c;记录到目前为止已经处理过的最大子数组。若已知 A[1…j]门的最大子数组&#xff0c;基于如下性质将解扩展为 A[1…j1]的最大子数组:A[1…j1]的最大…

张朝阳开课手推E=mc²,李永乐现场狂做笔记!CEO当太久都忘了他是MIT物理博士

张朝阳当物理老师还真是当上瘾了。 刚刚直接完成了一场线下课&#xff0c;当场手推质能方程&#xff0c;一整面黑板墙都差点没盛下。 这个姿势&#xff0c;是不是有你大物老师内范儿了&#xff08;手动狗头&#xff09;。 ‍没地方继续推导了&#xff0c;擦黑板前还要感慨一句…

AI 绘画 - 建筑绘图辅助设计之 SD 基础

前情提要 如果你想学会一门东西&#xff0c;那么就给交给自己一个明确的任务&#xff0c;然后独立完成&#xff0c;之后我们就可以掌握这门技术了&#xff1b; 简介 SD建筑绘画主要目的是将建筑概念转化为可视化的表达形式&#xff0c;以便更好地传达设计理念给业主、团队成…

AI 绘画 - 建筑绘图辅助设计之模型训练

前情提要 2023-06-18 周日 杭州 小雨 小记: 昨天搞的好累&#xff0c;10点左右就想着先躺一会儿&#xff0c;然后就睡过去了&#xff0c;很奇怪&#xff0c;如果进行 AI 绘画&#xff0c;晚上就会做很奇怪的梦&#xff0c;说不上来的那种感觉&#xff0c;就是莫名的不舒服。 …

如何使用Midjourney辅助建筑设计,常用的提示和使用效果展示(内附Midjourney提示词网站)

文章目录 一.Midjourney建筑设计的提示技巧1. prompt模板12.prompt模板2 二、著名建筑师为例1.Zaha Hadid&#xff08;扎哈哈迪德&#xff09;2.Ludwig Mies van der Rohe&#xff08;路德维希密斯凡德罗&#xff09;3.Renzo Piano&#xff08;皮亚诺&#xff09;4.Stefano Boe…

解药 or 毒药:ChatGPT辅助设计,规划师和建筑师要失业了吗?

​人工智能聊天机器人ChatGPT火爆全球&#xff0c; 规划师笔记也紧赶潮流&#xff0c;快速尝试&#xff0c; AI与设计发生碰撞&#xff0c; 会产生怎样的火花&#xff1f; 运用AI帮助写文案、作图、视频剪辑、游戏制作等等随着2021被称为元宇宙元年&#xff0c;近些年来AI在…

谈人工智能AI的崛起:是威胁人类的革命性变革?--元理先生

随着OpenAI推出ChatGPT后&#xff0c;全球都在疯狂的推进人工智能的发展进程&#xff0c;而人工智能的迅速发展和应用&#xff0c;使我们面临着一个前所未有的挑战&#xff1a;人工智能是否将威胁到人类工作岗位的存在&#xff1f;元理先生将与大家探讨人工智能可能对人类工作造…