微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

WebAuthn 身份验证器证明响应 id 和 rawId

如何解决WebAuthn 身份验证器证明响应 id 和 rawId

我想问一个关于 idrawId 的问题。

在实现 webauthn 时,在身份验证器证明响应中,我看到我们同时拥有 idrawId 。阅读规范 (https://www.w3.org/TR/webauthn-1/#dom-publickeycredential-rawid) ,idbase64url(rawId)

{
  "type": "public-key","id": "AV1--2gCLXLF9_5bGWDwZn6FP_OqAWfKY74mckatWMgN65o5OW8q2k9XVbYl8kAqPtpEoBlM0opKEjwDqYRBDIYbAl058O8ZQWS-r0M0L-9ikcu3tKuMxfFnRZ9gU6tnDH6QqzYwUg","rawId": "AV1--2gCLXLF9_5bGWDwZn6FP_OqAWfKY74mckatWMgN65o5OW8q2k9XVbYl8kAqPtpEoBlM0opKEjwDqYRBDIYbAl058O8ZQWS-r0M0L-9ikcu3tKuMxfFnRZ9gU6tnDH6QqzYwUg","response": {
    ...
  }
  ...
}

这是我的问题:

  • 为什么我们需要id
  • 为什么在上面的示例中,我的 idrawId 完全一样?
    • 总是一样的吗?如果是这样,我们可以在响应中去掉 id 吗?
  • 如果我将公钥 id 保存到数据库中(稍后使用该公钥 id 来创建 allowCredentials 列表),我应该遵循以下哪个?
    1. id保存在数据库中,使用id创建allowCredentials列表
    2. base64url(rawId) 保存在数据库中,然后使用该 base64 url​​ 编码值来创建 allowCredentials 列表

解决方法

在这种情况下,出于序列化目的,包含 rawId 的 ArrayBuffer 可能已转换为 base64,因此它们在您的示例中看起来相同。

至于使用哪个,我认为只要值在需要时以正确的编码或结构呈现即可。

我使用的库提供并需要一个 byte[],但我将它作为 base64 存储在数据库中。然后在序列化以将值发送到客户端时再次转换为 base64,然后在传递给 navigator.credentials.get() 之前在客户端转换回 ArrayBuffer。

至于为什么会这样,我怀疑有一个用例,从 base64 字符串转换 id 是不可取的,因此 PublicKeyCredential 类型添加了它自己的 [[identifier]] 槽的 ArrayBuffer 表示,但这只是我的猜想。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。