使用Apple公私钥认证时,如何查询设备上指定依赖方的Passkey?
能否查询设备上的Passkey公私钥列表?
不行,iOS系统出于隐私和安全保护,不允许应用直接查询设备上存储的Passkey凭证列表,哪怕只获取ID和依赖方ID这类元数据也不行。
为什么SecItemCopyMatching查不到?
Passkey并不存储在传统的钥匙串条目里,而是由系统的WebAuthn框架独立管理,SecItemCopyMatching仅能访问常规钥匙串项目(如密码、证书),无法获取Passkey相关条目,所以你用该API查不到结果是正常现象。
替代方案:间接判断当前设备是否有目标Passkey
虽然不能直接查询列表,但可以通过ASAuthorizationPublicKeyCredentialProvider的API间接判断:
- 使用
getCredentialState(forUserID:completion:)方法:传入服务器提供的用户ID,该方法会异步返回当前设备是否存在对应此用户ID和依赖方ID的Passkey。 - 示例代码:
let provider = ASAuthorizationPublicKeyCredentialProvider(relyingPartyIdentifier: "你的依赖方ID") provider.getCredentialState(forUserID: "服务器返回的用户ID") { state, error in switch state { case .authorized: // 当前设备存在该用户的Passkey,显示登录按钮 DispatchQueue.main.async { self.showPasskeyLoginButton() } case .revoked, .notFound: // 不存在对应Passkey,隐藏按钮 DispatchQueue.main.async { self.hidePasskeyLoginButton() } default: break } }
注意事项
- 该方法仅能针对已知用户ID查询,无法遍历设备上所有Passkey。
- 如果用户未完成前置登录(服务器无用户ID),需先引导用户输入邮箱/手机号等标识,获取用户ID后再调用此方法判断。
内容的提问来源于stack exchange,提问作者Egg
相关产品推荐
相关产品推荐

