Android Passkeys开发疑问:requestJson参数及challenge、rpId说明
Android Passkey集成:requestJson关键参数解析
你提到的GetPublicKeyCredentialOption构造器中的requestJson,核心是符合WebAuthn规范的请求参数,其中你疑惑的rpId和challenge,具体要求如下:
一、rpId(依赖方标识符)
- 是什么:代表你的应用所属的可信域名,是WebAuthn规范中用来标识依赖方(也就是你的服务)的唯一标识。
- 怎么填:
- 必须是你拥有或控制的合法注册域名,不能用IP地址。
- 要和你的应用通过**数字资产链接(Digital Asset Links)**关联的域名保持一致,比如你的应用绑定的网站是
your-app-domain.com,那rpId可以填your-app-domain.com,或者它的子域名(如auth.your-app-domain.com),但不能是顶级域名的后缀(比如.com)。 - 举个例子:如果你的测试应用关联的是
credential-manager-app-test.glitch.me,那rpId就填这个值,和教程示例一致。
二、challenge(挑战字符串)
- 作用:用来防止重放攻击的随机加密字符串,确保每次认证请求都是唯一且合法的。
- 生成方式:
- 必须在后端服务器生成:不能在客户端本地生成,要保证随机性和不可预测性。
- 生成步骤:
- 生成一个至少32字节的随机字节数组(用安全的随机数生成器,比如Java中的
SecureRandom)。 - 将这个字节数组做Base64URL编码(无填充),得到的字符串就是
challenge字段的值。
- 生成一个至少32字节的随机字节数组(用安全的随机数生成器,比如Java中的
- 验证逻辑:用户完成Passkey认证后,客户端会返回包含该challenge签名的结果,后端需要用自己保存的原始challenge来验证签名有效性,确认请求不是重复提交的。
其他字段补充
allowCredentials:登录场景下,可填入用户之前注册的Passkey凭证ID列表(Base64URL编码),用来限定用户只能用已绑定的凭证登录;如果是注册新Passkey,这个数组可以为空。timeout:请求的超时时间,单位是毫秒,示例中的1800000代表30分钟。userVerification:用户验证要求,可选值:required:必须验证用户身份(指纹/面部识别等)preferred:优先验证,但不强制discouraged:不需要验证
内容的提问来源于stack exchange,提问作者Ariel Malka
相关产品推荐
相关产品推荐

