iOS 17下如何从第三方密钥管理器1Password获取rawClientDataJSON?
第三方密码管理器(如1Password)获取
rawClientDataJSON的解决方案 你遇到的问题本质是用错了凭据类——ASAuthorizationPlatformPublicKeyCredentialAssertion/ASAuthorizationPlatformPublicKeyCredentialRegistration是苹果专门给iCloud密钥链设计的平台凭据类,1Password这类第三方密码管理器的密钥属于跨平台WebAuthn凭据,根本不会通过这些类返回数据,所以你拿到的字段是空的。
正确的获取方式
处理授权结果时,要判断凭据的实际类型,用通用的WebAuthn凭据类来提取rawClientDataJSON:
代码示例
func authorizationController(controller: ASAuthorizationController, didCompleteWithAuthorization authorization: ASAuthorization) { // 处理登录流程的断言 if let crossPlatformAssertion = authorization.credential as? ASAuthorizationPublicKeyCredentialAssertion { let rawClientData = crossPlatformAssertion.rawClientDataJSON // 将该数据传递至服务器 } // 处理注册流程的凭据 else if let crossPlatformRegistration = authorization.credential as? ASAuthorizationPublicKeyCredentialRegistration { let rawClientData = crossPlatformRegistration.rawClientDataJSON // 将该数据传递至服务器 } // 如需兼容iCloud密钥,保留以下可选代码 else if let platformAssertion = authorization.credential as? ASAuthorizationPlatformPublicKeyCredentialAssertion { let rawClientData = platformAssertion.rawClientDataJSON } }
额外注意事项
- 不要在请求凭据时限制仅获取平台凭据:检查
ASAuthorizationPublicKeyCredentialProvider的配置,别把platformCredential设为true,否则会过滤掉1Password这类第三方凭据。 - 所有第三方密码管理器的WebAuthn凭据都会走通用的
ASAuthorizationPublicKeyCredential*类,统一用这个分支处理就不会有问题。
内容的提问来源于stack exchange,提问作者Kit
相关产品推荐
相关产品推荐

