无密码时代来临,教你如何在 iOS 中配置和使用 Passkey

这里每天分享一个 iOS 的新知识,快来关注我吧

前言

随着数字安全的不断提升,苹果在 iOS 中引入了 Passkey 技术。这不仅让用户的登录过程更加便捷,也极大地提高了安全性。今天,我将为大家详细讲解如何在 iOS 中配置和使用 Passkey,即使你是一个新手,也能轻松上手。

什么是 Passkey?

简单来说,Passkey 是一种替代传统密码的身份验证方式。通过使用生物识别(如 Face ID 或 Touch ID)和设备上的加密技术,可以让你的账号更安全、更方便使用。

传统的账号 + 密码的模式,有几个很大的问题:

  1. 密码很容易被钓鱼网站窃取,从而造成损失。

  2. 麻烦,需要记住很多密码。

  3. 后来有了 2FA,虽然增加了安全性,但却更麻烦了

  4. 2FA 理论上不能完全防止钓鱼网站。

知道这些问题之后,Passkey 就应运而生了,目的就是解决这些问题的。

Passkey 的协议是由 W3C 和 FIDO 编写的规范,Google、Mozilla、Microsoft、Yubico 等大公司也参与其中。

目前为止,Passkey 已经被很多大公司旗下的产品支持,比如 Google、Facebook、Twitter、Apple 等。

原理是什么?

Passkey 的原理是私钥加密,公钥解密,分为登录和注册两部分。

注册

当你在一个网站注册账号时,网站会生成一个密钥对,公钥保存在网站,私钥保存在你的设备上,只有输入你的密码才能访问。

大概流程如图:

登录

当你登录时,网站会生成一个随机数,然后发送给你的设备,你的设备用私钥加密这个随机数,然后发送给网站,网站用公钥解密,如果解密成功,就可以登录了。

大概流程如图:

iOS App 中配置 Passkey

步骤一:关联域

接下来讲讲如何将 PassKey 集成在我们的 iOS 应用里,在我们开始之前,你需要确保以下几点:

  1. iOS 16 及以上支持 Passkey。

  2. 你的设备支持并已启用 Face ID 或 Touch ID。

  3. 你需要一个 Apple ID,并且已经登录你的设备。

因为苹果的 Passkey 是需要绑定一个域名的,这样可以防止钓鱼网站,第一步需要先去你的网站上支持关联域,这一步是为了在你的 host 和 app 之间建立一个安全的通道。

你的网站中需要增加一个 apple-app-site-association 文件(不带扩展名)。将其放在网站的根目录或者 . well-known 目录下,比如 https://你的域名/.well-known/apple-app-site-association, 文件的内容如下:

{
  
  "webcredentials": {
    "apps": ["ABCDE12345.com.example.app"]
  }
}

配置过 Universal Links 或者 App Clips 的同学应该对这个文件不陌生,这个文件的作用就是告诉 iOS 这个域名是和这个 app 关联的,不清楚的可以按照苹果官方文档来。

步骤二:配置输入框自动填充

在代码中,把你输入用户名的输入框设置为 username 类型,这样的目的是为了告诉 iOS 这个输入框是用来输入用户名的,这样 iOS 就会自动填充用户名来登录。

let usernameField = UITextField()
usernameField.textContentType = .username

步骤三:自动填充

当用户进入到登录页面时,我们首先需要向我们的服务端请求,他会生成一个数据(可能是随机数),来让我们生成对应的 Passkey 请求,然后开始请求。

我们使用的是 iOS 中的 AuthenticationServices 框架,所以使用前需要先 import:

func signIn() {
    let challenge: Data = … // 需要从服务端获取
    let provider =
        ASAuthorizationPlatformPublicKeyCredentialProvider(
            relyingPartyIdentifier: "example.com")
    let request =
        provider.createCredentialAssertionRequest(
            challenge: challenge)

    let controller =
        ASAuthorizationController(
            authorizationRequests: [request])
    controller.delegate = self
    controller.presentationContextProvider = self

    // 开始请求
    controller.performAutoFillAssistedRequests()
}

当用户点击输入用户名的输入框时,键盘上方就会出现一个提示,用户点击后就会自动填充。

这里多说一句,如果你不想直接使用自动填充,可以使用 performRequests 替换 performAutoFillAssistedRequests 方法,这样就不会自动填充了。

步骤四:处理代理回调

当用户点击自动填充后,我们的 app 就会收到一个回调,我们需要处理这个回调,来完成登录。

extension ViewController: ASAuthorizationControllerDelegate, ASAuthorizationControllerPresentationContextProviding {
    func presentationAnchor(for controller: ASAuthorizationController) -> ASPresentationAnchor { }
    
    func authorizationController(controller: ASAuthorizationController, didCompleteWithAuthorization authorization: ASAuthorization) {
        
        guard let passkeyAssertion = authorization.credential as?
                ASAuthorizationPlatformPublicKeyCredentialAssertion
            else { 
            return
        }

        let signature = passkeyAssertion.signature
        let clientDataJSON = passkeyAssertion.rawClientDataJSON

        
    }
    
    func authorizationController(controller: ASAuthorizationController, didCompleteWithError error: any Error) {
        print("授权失败,error: (error.localizedDescription)")
    }
}

授权成功回调后,我们需要把数据发送给我们的服务端,服务端会验证这个数据,如果验证成功,就可以登录了。

这样就完成了 Passkey 的配置,用户在登录时就可以使用 Passkey 来登录了。

注册 Passkey

上边的例子是登录,注册也是类似的,一般来说,注册 Passkey 的时候会先有一个用户在你们平台的账号,Passkey 只是做一次关联,方便下次用户快捷登录。

所以这里我们默认用户已经有了一个你们平台用户 id,然后我们需要向服务端请求一个 challenge,然后生成一个注册请求,然后发送给服务端。

let challenge: Data 
let userID: Data 
let userName: String 
let platformProvider = ASAuthorizationPlatformPublicKeyCredentialProvider(relyingPartyIdentifier: "example.com")
let platformKeyRequest = platformProvider.createCredentialRegistrationRequest(challenge: challenge, name: userName, userID: userID)
let authController = ASAuthorizationController(authorizationRequests: [platformKeyRequest])
authController.delegate = self
authController.presentationContextProvider = self
authController.performRequests()

处理回调的方法也类似:

func authorizationController(controller: ASAuthorizationController, didCompleteWithAuthorization authorization: ASAuthorization) {
    if let credential = authorization.credential as? ASAuthorizationPlatformPublicKeyCredentialRegistration {
        
    } else if let credential = authorization.credential as? ASAuthorizationPlatformPublicKeyCredentialAssertion {
        
    } else {
        
    }
}

func authorizationController(controller: ASAuthorizationController, didCompleteWithError error: Error) {
    
}

常见问题解答

1. 如果我更换了设备怎么办?

Passkey 默认是保存在 iCloud 里的,如果你更换了设备,只需要在新设备上登录你的 Apple ID,Passkey 会自动同步到新设备上。

2. 我可以同时在多个设备上使用 Passkey 吗?

当然。只要这些设备都登录了同一个 Apple ID,并且启用了 Face ID 或 Touch ID 就行。

3. 万一我的设备丢失了怎么办?

如果你的设备丢了,最好第一时间通过 iCloud 尝试找回设备,如果找不到,最好远程抹除数据。这样,即使盗窃者拿到你的设备和密码,也无法使用 Passkey 登录你的账号。

网页端实现

Passkey 不仅在移动端可用,在 web 端也是可以的,而且各大浏览器也都已经支持了。

今天主要讲的是 iOS 端的 Passkey,如果你想在网页端实现 Passkey,可以参考这篇博客。

这是 swift 博客中的一篇关于 web 端实现 Passkey 的文章,里面详细介绍了如何在 web 端实现 Passkey,包含服务端实现和 web 端实现。都是用 swift 实现的。

总结

通过今天的文章,希望大家能够学会在 iOS 中配置和使用 Passkey,它不仅提升了安全性,还使登录体验更加方便流畅了。

希望国内的各大公司也能尽快支持 Passkey,相信无密码时代不会太远了。

这里每天分享一个 iOS 的新知识,快来关注我吧

参考资料

[1]

关联域苹果官方文档: developer.apple.com/documentati…

[2]

web 端实现: www.swift.org/documentati…

本文同步自微信公众号 “iOS新知”,每天准时分享一个新知识,这里只是同步,想要及时学到就来关注我吧!

阅读全文
下载说明:
1、本站所有资源均从互联网上收集整理而来,仅供学习交流之用,因此不包含技术服务请大家谅解!
2、本站不提供任何实质性的付费和支付资源,所有需要积分下载的资源均为网站运营赞助费用或者线下劳务费用!
3、本站所有资源仅用于学习及研究使用,您必须在下载后的24小时内删除所下载资源,切勿用于商业用途,否则由此引发的法律纠纷及连带责任本站和发布者概不承担!
4、本站站内提供的所有可下载资源,本站保证未做任何负面改动(不包含修复bug和完善功能等正面优化或二次开发),但本站不保证资源的准确性、安全性和完整性,用户下载后自行斟酌,我们以交流学习为目的,并不是所有的源码都100%无错或无bug!如有链接无法下载、失效或广告,请联系客服处理!
5、本站资源除标明原创外均来自网络整理,版权归原作者或本站特约原创作者所有,如侵犯到您的合法权益,请立即告知本站,本站将及时予与删除并致以最深的歉意!
6、如果您也有好的资源或教程,您可以投稿发布,成功分享后有站币奖励和额外收入!
7、如果您喜欢该资源,请支持官方正版资源,以得到更好的正版服务!
8、请您认真阅读上述内容,注册本站用户或下载本站资源即您同意上述内容!
原文链接:https://www.shuli.cc/?p=21242,转载请注明出处。
0

评论0

显示验证码
没有账号?注册  忘记密码?