You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 11:22:05