大多数浏览器和
Developer App 均支持流媒体播放。
-
充分利用“通过 Apple 登录”
通过 Apple 登录可以使人们轻松使用已有的 Apple ID 登录 app 和网站。我们将利用安全请求、处理状态更改和服务器通知,充分结合通过 Apple 登录到你的 app 中去。我们还将向你介绍新的API,使你可以允许现有用户快速、轻松地切换为通过 Apple 登录。
资源
- Human Interface Guidelines: Sign in with Apple
- Implementing User Authentication with Sign in with Apple
- Sign In with Apple
相关视频
WWDC22
WWDC21
WWDC20
WWDC19
-
下载
(你好 WWDC 2020)
你好 欢迎来到 WWDC
大家好 欢迎观看 《充分利用“通过 Apple 登录”》讲座 我叫 Alfonso 与我的同事 Jonathan 一起 我们会讨论 今年我们在“通过 Apple 登录”方面 研究出的最佳做法以及一些新功能 如你所知 “通过 Apple 登录”能够使 你的应用软件登录体验变得更加快捷 它深受用户喜爱 不仅十分简单易用 还使用户不再需要记住他们的密码 它的隐私功能受到了用户的肯定 其中超过一半的人 选择使用私人电子邮件中继 因为有了“通过 Apple 登录” 用户现在能够只通过一次轻点 就在你的应用软件中创建一个账号 如果你还没观看去年 WWDC 中的 《“通过 Apple 登录”的介绍》讲座 请一定要前去观看 你将在里面看到 如何为你的应用软件 添加这项功能的现场演示 今天 我们会讨论几个主题 我们首先会深入探讨授权请求 以及如何使之更加安全 接着 我们会讨论为你的应用软件 处理凭据状态变更的最佳做法 我们还会介绍 新的服务器到服务器开发者通知 以及“通过 Apple 登录”按钮上的 一些新添加和更改 最后 我们会讨论 如何升级为“通过 Apple 登录” 如你所知 安全对于我们的用户来说非常重要 这也是我们在创建“通过 Apple 登录”时 十分注重的一个方面 在使用“通过 Apple 登录”时 你的账户已经获得了强大的安全功能 比如自动双因素认证 但你还可以通过一些别的举措 来让你的请求更加安全 今天 我们会回顾一些 你在创建授权请求时的最佳做法 以及如何充分利用 集成于其中的安全功能
这个例子展示了 如何使用 Swift 来创建一个授权请求 如果你看过我们的前一个讲座 或者以前执行过“通过 Apple 登录” 这些会看起来非常熟悉
这就是我们将要用于处理 “点选通过 Apple 登录”的方法 也是创建你的授权请求 和控制器的正确位置
如你所知 你可以通过修改请求属性 来添加像是“请求范围”之类的内容 以防你的应用软件 需要姓名或电子邮件之类的用户信息
但正如我们之前提到的 请求也具有一些属性 能够帮助授权过程变得更加安全 它们分别是随机数和状态
这些属性使你能够在执行一个请求后 验证得到的授权和凭据与你预期的一样 我们首先说说这些属性是什么 随机数是在请求中 作为字符串发送的一个不透明数据块 每当你创建一个新的请求时 都要生成一个唯一的随机数 这点很重要 因为只有这样 你之后才能验证这个值
为此 随机数值会被嵌入在 授权凭据的身份令牌属性中返回给你
这将使你能够在服务器中验证这个值 从而有助于防止重放攻击
与随机数相似 状态值 也是与请求一同发送的不透明数据块 它与随机数值的一个关键不同点在于 状态会在凭据中被返回 从而使你能够在本地 将一条凭据与一个请求相匹配 并验证这是从你的应用软件中生成的 在添加了这些属性后 我们就准备好让控制器 来执行我们的请求 并将其呈现给用户了
这时 用户将看到这条授权请求 如屏幕中所示 如果你请求获得用户的电子邮件地址 用户将可以选择共享 或隐藏他们的电子邮件地址 如果用户决定隐藏他们的电子邮件地址 你将收到一个私人电子邮件中继 你或许会对此有一些疑问 比如 “私人电子邮件中继是什么? 我该如何验证这个电子邮件地址? 如果我需要用户进行回复怎么办?” 那么我们来尝试回答其中的一些疑问
电子邮件中继就和一个真正的 电子邮件地址一样 而且是团队范围的 也就是说它们对你来说具有唯一性 但在你的所有应用软件中 一位用户 将始终对应同一个电子邮件地址
电子邮件中继会将电子邮件发送到 经过 Apple 验证的 为用户所拥有的一个真实电子邮件地址上 这样你就不必担心 对电子邮件地址进行验证了
你还可以确定 在你需要用户回复的情况下 他们将能够回复你的电子邮件 这个服务始终在线 所以用户可以 随时接收和回复你的电子邮件 你可以看到 这让电子邮件中继 成为用户的一个很棒的选择 同时也维持了 你与用户之间便捷的通信方式 如果一位用户选择使用私人电子邮件中继 请务必尊重他们的选择 当用户做出选择后 授权将会进行下去 授权成功后 你将在授权控制器的委托方法中 收到一条凭据 这个例子展示了如何从授权中获得凭据
在这条凭据中 你会找到一系列属性 其中包含你请求的 像是姓名和电子邮件之类的用户信息
此外 你还将找到一些重要属性 可以使你 安全地验证这条请求 并与你的服务器创建会话 它们是状态、身份令牌和授权码
如你所知 这其中的一些参数 比如姓名和电子邮件 只会在用户 首次授权你的应用软件时被包含在凭据内
因此 对你需要的对象进行缓存非常重要 以防止由于连接较差 造成与你的服务器通信失败 这样的话 你需要的重要信息就不会丢失了
请你务必验证凭据的状态值 与你之前生成的状态值一致
正如我之前提到的 响应中包含 一个授权码和一个身份令牌 将这些数值发送给你的服务器来进行解码
解码完成后 对接收到的信息 以及与 Apple 服务器的会话进行验证 我们来看看 身份令牌被你的服务器解码后是什么样子 你可以看到 从中能够获得的一些值包括 主体 也就是授权中返回给你的用户标识符 并使你能够在你的服务器中创建会话
随机数 和我们之前提到的一样 这是一个非常重要的值 要去验证这个随机数 与你之前在请求中生成的随机数一样 这可以让你验证授权的真实性 并有助于减轻重放攻击
如果你请求获得用户的电子邮件地址 那么它也会被包括在身份令牌内
最终 real_user_status 将在用户 首次授权你的应用软件时被返回 其中包含三种状态中的一种 “0”表示不被支持 “1”表示未知 “2”表示可能为真 正如我们刚才看到的 身份令牌是一个 JSON 网络令牌 它包括多条与授权相关的信息
你得到了这些信息后 应该使用 从 Apple 获取的公共密钥 来验证这个令牌 并且要确保令牌没有过期
你可以与 Apple ID 服务器交换授权码 成功交换后 你将收到一个刷新令牌 和一个访问令牌 来用于以后的调用 此外还会得到一个新的身份令牌 它应该与你已有的令牌相同
你可以每天验证一次刷新令牌 来确认那台设备上的 用户 Apple ID 仍然有效 按照这些最佳做法 你不仅可以确保 你的用户会拥有出色且流畅的登录体验 还可以让你确信 授权 以及它所包含的信息是安全有效的 我们介绍完了授权过程 现在来说说 为你的应用软件 检查凭据状态的最佳做法 为此 我们使用 getCredentialState API 它可以通过发送当前储存的用户标识符 来允许你验证一条凭据的当前状态
API 将帮你验证 用户在这台设备上 以及在你的应用软件中保持登录状态 从而帮助你确保可以正常进行你的会话
每当你启动应用软件 或者将它转为前台运行时 调用此方法都非常重要 这样 你就能够 及时对状态的任何变化作出反应 并在你的应用软件中 向用户显示恰当的页面
这些是你在调用这个 API 时 会接收到的已知状态 我们再次快速回顾一下它们 以及遇到每一种后分别该怎么做
“已授权”意味着你可以让用户 跳过登录界面 直接进入你的应用软件
“撤销”是指用户决定登出你的应用软件 这种情况下 你应该使用户 从你的应用软件中退出登录 关闭会话 并显示登录页面 “无法找到”会在 没有与用户标识符相匹配的凭据时被返回 这时候要显示登录页面 让用户可以对你的应用软件进行身份验证 最后 你会注意到一条新的凭据状态
“已转移” 我们来说说这个凭据状态 以及我们该如何处理它
只有近期从一个开发团队 转移到另一个开发团队的应用软件 才会接收到“已转移”凭据状态 比如 在某个公司被收购之后
正如我们之前所提到的 用户标识符对团队来说具有唯一性 所以在转让应用软件的所有权时 需要将现有用户迁移到 一个新的用户标识符上 来与新团队相匹配
这种迁移会以静默方式处理 也就是说 不需要用户进行任何交互 就可以通过调用创建新账户或登录用户 所使用的同一个 API 来触发这个操作 如你所见 这是创建新账户 或登录现有账户所使用的相同代码
通过在请求中 添加当前已储存的用户标识符 我们可以使用户的“已转移”状态生效 并生成与新团队相匹配的新用户标识符
响应会在 授权控制器委托方法中被返回 这样 用户就可以继续使用这个应用软件 而不会注意到任何变化 现在来谈谈我们今年在 “通过 Apple 登录”中引入的一项新功能 即服务器对服务器开发者通知 侦听这些通知将让你能够直接在服务器上 监测诸如凭据状态变更之类的信息 以及接收其它类别的事件 接收这些通知的开启过程十分简单 首先 你必须在 Apple 开发者网站上 注册你的服务器端点 注册完成后 你就可以开始接收事件了
事件会作为 由 Apple 签署的 JSON 网络令牌发送 我们来看这些令牌是什么样子的 如你所见 JSON 网络令牌会包含重要信息 比如应用软件的发行方和捆绑包标识符 这个是“禁用电子邮件”事件的示例 如果用户决定 停止在他们的电子邮件中继上 接收电子邮件 那么你就会收到这条通知
“启用电子邮件”事件 是指用户选择重新开始接收电子邮件消息 重要的是要注意 这个事件 以及禁用电子邮件 只会在用户之前决定 为账户使用私人电子邮件中继的情况下 被发送出去 “撤销同意”举动会在一位用户决定 停止在你的应用软件中 使用他们的 Apple ID 后被发送给你 你应该把它当作用户退出登录来对待 例如 当用户决定将你的应用软件 与设置断开连接时 你就可能会接收到这条通知 最后 “账户删除” 当用户要求 Apple 删除 他们的 Apple ID 时 就会发送这个事件 收到这条通知时 与该用户相关联的用户标识符将会失效 如你所见 通过侦听这些通知 你将能够直接在你的服务器上 更好地针对 这四种不同的情况作出反应 现在来说说我们今年引入的另一项新功能 SwiftUI 中的“通过 Apple 登录”按钮 使用 SwiftUI 能够十分轻松地在你的应用软件中 呈现“通过 Apple 登录”按钮 不仅如此 SwiftUI API 还可以帮助你创建授权请求 并在同一个代码块中处理响应
如你所见 创建按钮非常简单 在你的视图上 你只需添加一个 SignInWithAppleButton 对象 并为它指定一个标签 在这个例子中 我们选择了“登录” 不过我们也可以选择“继续”或“注册” 接下来 我们就有了一个 onRequest 闭包 可以在上面创建我们的请求 和我们之前在 Swift 中看到的一样 你应当在这里添加请求范围 比如姓名和电子邮件 以及我们讨论过的随机数和状态值
通过使用按钮 我们还会有一个 onCompletion 闭包 我们可以在上面获得请求结果 并处理成功或失败的情况 这和你在 授权控制器的委托方法中的做法一样 最后 我们还可以选择按钮样式 “通过 Apple 登录”按钮的可用样式 有黑色、白色和白色勾边 既然我们正在讨论按钮样式 那么如果你需要使 “通过 Apple 登录”按钮更加个性化 来搭配你的网站或应用软件的具体设计 我们非常乐意为你介绍一个新的在线门户 你可以通过它来实现这点 你可以通过以下链接访问此网站 appleid.apple.com /signinwithapple/button 在这里 你能够对按钮的许多特性进行自定义 比如标签、尺寸以及各元素的位置 你还可以下载并获得按钮资源 这样就可以将它们导入你的项目或网站了 现在 我想邀请 Jonathan 来谈谈升级为“通过 Apple 登录” 谢谢 Alfonso 我们在去年发布了“通过 Apple 登录” 客户反馈一直相当热烈 只需要轻点一次 就能登录你的 app 这点深受用户喜爱 但是对于那些已经在使用 传统的基于用户名和密码的账户 又不想放弃现有账户的用户该怎么办呢? 今年 我们引入了一个新 API 来帮助你的用户 升级为使用“通过 Apple 登录” 不过你为什么 想让你的用户将他们的账户升级为 “通过 Apple 登录”呢? 首先 这对你和你的用户来说都是安全的 升级为“通过 Apple 登录” 是将你的账户 转变为双因素认证最简单的方法 “通过 Apple 登录”需要双因素 并且会将设备信任用于本地凭据状态 “通过 Apple 登录”也能使账户恢复 变得容易得多 用户忘记了他们的密码 也需要进行验证 有了“通过 Apple 登录” 你不再需要管理 用户的秘密 它已经全部为你完成了 利用这个 API 你可以防止重复账户 用户十分喜爱 “通过 Apple 登录”的便捷性和安全性 那些已经拥有传统的基于用户名 和密码的账户的用户 不用为了使用“通过 Apple 登录” 而放弃他们现有的账户 因为现在他们只需升级就可以了 那么 “升级到通过 Apple 登录”是什么? “升级到通过 Apple 登录”是一个新 API 专门用来为你的用户提供快捷的安全升级 而且它在 iOS 和 iPadOS 的 多个位置均可使用 包括你的 app 为了帮助你将用户 升级为“通过 Apple 登录” 身份验证服务会利用一个基于扩展的 API 我们把这个扩展称为 账户身份验证修改扩展
使用它来把登录方式 升级为“通过 Apple 登录” 能够为你的用户提供一种无缝体验
当用户从弱凭据 升级为“通过 Apple 登录”时 这个弱凭据会在流程成功完成后 被从系统中删除
我们还包含了 对于添加你自己的用户界面的支持 这是考虑到在一些情况下 请求“通过 Apple 登录”的凭据前 需要先完成安全验证
这个扩展 不仅支持升级为“通过 Apple 登录” 还支持强密码升级 在我们这个讲座中 我将为新的 “升级为通过 Apple 登录”的流程 提供一个概览 关于执行这个新 API 的所有详情 包括强密码升级 我邀请大家查看 WWDC 2020 中的 《账户安全一键升级》讲座 执行之后 用户可以通过三种方式来唤出 你的账户修改扩展
第一种 是当安全建议在设置里的新密码管理器中 识别出一个弱凭据时
第二种 是当一位用户与你的 app 进行交互时 使用了密码自动填充 而选中的凭据为一条弱凭据时
最后一种是当你通过 你在 app 中指定的用户交互 来唤出新的身份验证服务 API 时 既然我们明白了 扩展会在哪些情况下被唤出 现在就让我们来看看它是如何运行的 账户修改扩展涉及到一些概念 光从名字也许不太好理解 我来说明一下 ASAccountAuthentication ModificationViewController 是一个视图控制器 它的子类是 NSExtensionPrincipalClass
你的扩展被首次调用后 将唤出非用户交互函数 它会使用现有凭据 首次尝试将用户升级为 “通过 Apple 登录” 我们希望看到大部分升级在这里出现 因为这对用户来说是最省时省力的方法
要明白 在某些情况下 会需要追加用户界面来验证一位用户 所以可能会显示一个增强安全视图 接着 我们会把同一个凭据通过一个 单独定义的函数传给扩展
最后一个元素是扩展关联属性 扩展关联的作用是 在用户交互和增强安全函数内 让你的扩展 与扩展托管过程进行通信 使用扩展关联 你将能够告知扩展托管过程 之前发生了什么 以及之后需要发生什么
这里你能看到 ExtensionViewController 子类的存根版本 名字是 AccountModificationViewController 如你所见 它正在重写三个函数 首先 convertAccountToSignIn WithAppleWithoutUserInteraction 为了尝试在无用户交互的情况下升级凭据 它最初会由扩展托管过程调出
接着是 viewDidLoad 必要时 可以用它为安全增强流程 设置一个中间用户界面 如果你预计会出现网络调用或延迟 那么提供中间用户界面来指示进程 也许有助于提供最棒的用户体验 最后 prepareInterface ToConvertAccountToSignInWithApple 会在你的视图出现前被调用 它会通过非用户交互流程 提供的同一个 ASPasswordCredential 这个凭据会被用来进行 比如在表单中预填写用户名 或者启动双因素认证流程这类操作 对于需要花费一定时间的任务 应该异步完成 利用中间用户界面来指示进程 你的增强视图在这次调用结束前不会显示
我们说完了关于 AccountAuthentication ModificationViewController 的概览 现在我们来进一步了解 它们是如何协同工作的 来看看 ASAccountAuthentication ModificationExtensionContext 扩展关联 是账户修改视图控制器的核心属性 正如之前所提到的 扩展关联被用来 控制升级的流程 那么 它是如何控制流程的? 首先 它的一个函数 会请求“通过 Apple 登录”授权 正如 Alfonso 之前提到的 这与通过一条 Apple ID 凭据 来调用执行请求十分相似 这将会显示你的 app 特定的 “通过 Apple 登录”用户界面
接着 如果你在评估凭据 或是当前已登录账户 并判定 需要使用追加用户界面来验证账户 那么扩展关联就会被用来 请求显示增强安全用户界面
扩展关联还可以被用来 让托管过程完成流程 这会把现有的凭据删除
最后 在你需要完全取消流程的情况下 扩展关联也会被使用到
我们来进一步探讨扩展关联属性的详情
getSignIn WithAppleAuthorizationWithState 显示了带有你 app 信息的 “通过 Apple 登录”用户界面 同时请求用户对升级进行授权
之前 Alfonso 提到 在 ASAuthorizationAppleID 请求上 设置一个状态和一个随机数 在升级流程中 随机数和状态作为参数被传给这个调用 用户授权进行升级后 完成处理程序会在流程完成后 与 Apple ID 凭据一同被调用
接下来是 completeUpgradeToSignInWithApple 它会让扩展托管过程 得知授权已经成功完成 由此将密码凭据删除
最后是 cancelRequest
API 预期 会通过 ASExtensionError 来调用它 如果你的扩展判定 需要向用户显示追加用户界面 那么务必通过 userInteractionRequired 错误来调用它 如果用户在你的用户界面流程中取消 那么可以使用 userCanceled 错误
其它所有失败都可以使用失败错误
在之前几张幻灯片中 我们简要概述了 账户修改视图控制器 接着我们回顾了扩展关联属性 以及它是如何控制流程的 现在 我们来更深入地了解 在无用户界面的情况下 转变账户的执行详情 当用户使用一条弱凭据进行交互 并想要将这条凭据升级为 “通过 Apple 登录”时 我们就会在 OS 中开始这个流程
你的账户修改扩展 会被密码管理过程初始化 同时调用“无用户界面转变”函数 前提是密码凭据想要升级为 “通过 Apple 登录” 扩展要做的工作 是对已通过的凭据进行评估 以确保它在升级为 “通过 Apple 登录”之前是有效的
这个时候 检查用户名是否与 当前已登录的用户相匹配 是很明智的第一步
我们假设扩展判定已登录用户的状态 和已通过的凭据 需要调用服务器来验证账户
服务器验证了凭据 并且身份验证成功
接着 服务器给扩展提供反馈 以确认账户已经准备好 升级为“通过 Apple 登录”
在确认此账户 通过了身份验证并符合升级条件后 扩展关联将被用于请求 Apple ID 凭据 但在进入流程的这一部分前 我们一起来看看 如果账户由于存在问题 而阻止了立即升级会发生什么
正如我们在之前的案例中所见 当用户使用一条弱凭据进行交互 并想要将这条凭据 升级为“通过 Apple 登录”时 流程就会开始 接着 你的账户修改扩展 会被密码管理过程初始化 然后会通过密码凭据调用 “准备进行无用户界面转变”函数
之后扩展会对凭据进行验证 我们花点时间 来看一些用于验证凭据的代码示例 如你所见 这个代码示例定义了一个 代表验证结果的枚举
有三个值来代表验证结果 成功、失败 以及需要双因素认证
对已有凭据进行验证后 这三个值中的一个将会被返回
失败结果对应了一些情况 比如当服务器尝试验证凭据时 此账户或服务器状态 并不适合在当时转变账户 针对这种情况 可以使用 extensionContext 来调用针对失败错误的 cancelRequest 这样就会结束流程
成功意味着 此账户已经准备好立刻进行转变 正如我们之前在时序图中展示的一样 接着会使用扩展关联 来获取 Apple ID 凭据
需要双因素认证是指 我们需要向用户呈现一些用户界面 凭据本身 不足以升级为 “通过 Apple 登录” 这种情况的处理方式 是通过使用扩展关联 来调用针对 userInteractionRequired 错误的 cancelWithError
回到这个图中 扩展会调用 verifyCredential 函数 这会使扩展的后端被调用 以对凭据进行验证
服务器将通过请求来试图验证账户
服务器判定这个账户需要进行追加验证
这条反馈回到扩展上 然后 verifyCredential 函数将它评估为 需要双因素认证的认证结果
正如 verifyCredential 函数的代码示例 所展示的 这个情况的处理方式 是通过使用扩展关联 来调用针对 userInteractionRequired 错误的 cancelWithError 我们建议你只在需要时请求用户界面 从而避免为用户增加负担 大多数情况下 如果用户 已经在你的 app 中通过了身份验证 那么我们会预计非用户交互流程 将足以完成转变 然而 就像在这个例子中一样 某些情况下 用户界面流程也许是必要的 我们来看看它的工作原理 扩展关联由于 userInteractionRequired 错误而取消后 密码管理过程会初始化一个 账户修改视图控制器的新实例
并调用“准备进行无用户界面转变”函数 同时传递 ASPasswordCredential
这时会显示扩展的视图控制器 它同时还会提供 中间用户界面 比如一个旋转的齿轮
在情形略有变更的情况下 使用与之前相同的凭据 一个请求就被发送给了后端
服务器视图尝试验证账户 要求双因素认证(2FA) 接着反馈给扩展
扩展更新视图 向用户请求双因素认证
用户提供验证码 扩展随后进行验证 如果用户无法在此时通过验证 扩展关联就会被用来 取消包含失败错误的流程 我们假设用户提供了一个有效的验证码 并且验证成功 扩展现在准备好请求 Apple ID 凭据 那么现在 我们又回归了正确的道路 即这个账户 已通过身份验证并满足升级条件 现在账户准备就绪了 让我们请求 Apple ID 凭据 并结束流程
正如 Alfonso 之前提到的 保证请求的安全非常重要 为此 你的扩展 会生成一个状态和一个随机数 并将它们作为参数 传给 getAppleIDCredential 调用函数 这最终会向用户呈现 “升级到通过 Apple 登录”用户界面 然后用户授权使用面容 ID
Apple ID 凭据在 getAppleIDCredential 调用函数的完成块中被提供给扩展 接着扩展会验证凭据的状态属性 与之前生成的一致
然后扩展会请求账户进行升级 同时向服务器后端 提供必要的账户信息和 Apple ID 凭据 从而让账户进行转变
接着 后端会与 Apple 服务器交换授权码 同时在身份令牌中验证随机数值 如果成功 就会对账户执行转变
转变后 它会反馈一个成功值 需要再次着重强调的是 如果服务器操作失败 应该使用扩展关联调用针对失败错误的 cancelWithError
这次 服务器表明成功了 所以扩展将执行任何必要的簿记工作 接着在扩展关联上调用 completeUpgradeToSignInWithApple 这就会使密码管理器将已有凭据删除 流程到此也就完成了 新的身份验证服务账户修改扩展 是专门为帮助用户改善安全性而构建的 提供“通过 Apple 登录” 代替用户的弱凭据 因为我们删除了旧凭据 所以用户以后 登录你的 app 时就不会混淆了 利用这个 API 你能够帮助你的用户执行 对他们的凭据而言的最佳安全做法 同时也避免了账号重复
“升级到通过 Apple 登录” 为你提供了 一个便捷的 API 来为用户的现有账户进行升级 我们十分期待看到 你会如何执行“升级为通过 Apple 登录” 并且期待你的反馈 希望大家喜欢我们今天的演讲 谢谢你们的参与 祝大家度过一场精彩的 WWDC
-
-
2:02 - Create an Authorization Request
// Configure request, setup delegates and perform authorization request @objc func handleAuthorizationButtonPress() { let request = ASAuthorizationAppleIDProvider().createRequest() request.requestedScopes = [.fullName, .email] request.nonce = myNonceString() request.state = myStateString() let controller = ASAuthorizationController(authorizationRequests: [request]) controller.delegate = self controller.presentationContextProvider = self controller.performRequests() }
-
5:37 - Get a credential from an Authorization
// 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 let realUserStatus = credential.realUserStatus let state = credential.state let identityToken = credential.identityToken let authorizationCode = credential.authorizationCode // Securely store the userIdentifier locally self.saveUserIdentifier(userIdentifier) // Create a session with your server and verify the information self.createSession(identityToken: identityToken, authorizationCode: authorizationCode) } }
-
8:51 - Verify the state of a credential
// Getting a credential state let provider = ASAuthorizationAppleIDProvider() provider.getCredentialState(forUserID: getStoredUserIdentifier()) { (credentialState, error) in switch(credentialState) { case .authorized: // Sign in with Apple credential Valid case .revoked: // Sign in with Apple credential Revoked, Sign out case .notFound: // Credential was not found, fallback to login screen case .transferred: // Application was recently transferred, refresh User Identifier @unknown default: break } }
-
11:00 - Migrate a user identifier
// Migrating a user identifier let request = ASAuthorizationAppleIDProvider().createRequest() request.requestedScopes = [.fullName, .email] request.user = getStoredUserIdentifier() request.nonce = myNonceString() request.state = myStateString() let controller = ASAuthorizationController(authorizationRequests: [request]) controller.delegate = self controller.presentationContextProvider = self controller.performRequests()
-
13:54 - Create a Sign in with Apple button
// SwiftUI example: SignInWithAppleButton(.signIn) { onRequest: { (request) in request.requestedScopes = [.fullName, .email] request.nonce = myNonceString() request.state = myStateString() } onCompletion: { (result) in switch result { case .success(let authorization): // Handle Authorization case .failure(let error) // Handle Failure } } }.signInWithAppleButtonStyle(.black)
-
25:15 - convertAccountToSignInWithAppleWithoutUserInteraction
enum VerificationResult : Int { case success; case failure; case twoFactorAuthRequired; override func convertAccountToSignInWithAppleWithoutUserInteraction( for serviceIdentifier: ASCredentialServiceIdentifier, existingCredential: ASPasswordCredential ) { verifyCredential(existingCredential) { (result: VerificationResult) in switch result { case .failure: self.extensionContext.cancelRequest(withError: ASExtensionError(.failed)) case .success: self.extensionContext.getSignInWithAppleAuthorizationWithState(state: myStateString(), nonce: myNonceString(), {…} case .twoFactorAuthRequired: self.extensionContext.cancelRequest(withError: ASExtensionError(.userInteractionRequired)) } }
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。