Android与iOS平台:如何判断设备是否配置指定keyhandle的Passkey?
区分当前设备已配置的Passkey(基于Keyhandle)
Android 平台
Android 可借助 Jetpack Credentials 库中的 CredentialsManager API 实现该需求:
- 构建
GetCredentialRequest时,通过PublicKeyCredentialOption的allowList参数指定目标 keyhandle 对应的凭证ID,发起本地凭证查询。 - 若设备本地存在匹配的 Passkey,API 会返回对应凭证;无匹配项时则抛出
GetCredentialException。 - 核心代码示例:
val credentialManager = CredentialsManager.create(context) val request = GetCredentialRequest.Builder() .addPublicKeyCredentialOption( PublicKeyCredentialOption.Builder() .setRpId("你的RP ID") .setAllowList(listOf(PublicKeyCredentialDescriptor(PublicKeyCredentialType.PUBLIC_KEY, keyhandleBytes))) .build() ) .build() try { val result = credentialManager.getCredential(context, request) // 当前设备存在该Passkey } catch (e: GetCredentialException) { // 当前设备不存在该Passkey }
iOS 平台
iOS 可通过 ASAuthorizationPublicKeyCredentialProvider 完成本地凭证校验:
- 调用
getCredentialState(for:)方法,传入目标 keyhandle 转换后的Data类型凭证ID,查询本地凭证状态。 - 方法返回的
ASAuthorizationCredentialState枚举中,authorized表示设备本地存在该 Passkey,revoked或notFound则表示不存在。 - 核心代码示例:
let provider = ASAuthorizationPublicKeyCredentialProvider(relyingPartyIdentifier: "你的RP ID") guard let credentialID = Data(base64Encoded: "你的keyhandle字符串") else { return } provider.getCredentialState(for: credentialID) { state, error in switch state { case .authorized: // 当前设备存在该Passkey case .revoked, .notFound: // 当前设备不存在该Passkey default: // 其他异常状态 } }
关键注意事项
- 两个平台的API都要求使用创建Passkey时的同一RP ID(依赖方标识符),否则无法匹配到目标凭证。
- 存储的keyhandle通常为Base64编码字符串,需先解码为对应平台要求的二进制格式(Android为
ByteArray,iOS为Data)后再传入API。
内容的提问来源于stack exchange,提问作者Esann
相关产品推荐
相关产品推荐

