先试试演示建议您检查演示是否能与您计划支持的浏览器和设备上的 passkey 提供商配合使用。Authenticator 支持页面列出了已测试过的组合。
安装
要求
- HTTPS,或在开发中使用
localhost。 - 一个支持 WebAuthn PRF 扩展的 passkey 提供商,例如 iCloud Keychain、1Password 或 Google Password Manager。Authenticator 支持页面列出了完整列表。
创建 passkey
createPasskeyWithPrfOutput 提示用户创建 passkey,并返回 32 字节的密钥。
credentialId。回访时使用带有该凭据的 getPasskeyPrfOutput,这在登录一节中有介绍。
凭据元数据不包含任何密钥材料,因此使用 localStorage 存储是可以的。在下一次登录时将其传回,可以让浏览器直接跳到相同的 passkey,而不是要求用户挑选。
派生密钥
由 passkey 返回的 32 字节prfOutput 可用于派生标准的 BIP-44 账户。以这种方式派生可以保持账户的可移植性,因此导出的助记词可以导入 MetaMask 或 Rabby,并产生相同的地址。
index 以从同一个 passkey 派生更多账户。
发送交易
签名会话持有密钥,toViemAccount 将其包装为 viem 的 LocalAccount。它与任何其他 viem 账户表现一致,支持相同的签名方法。
end() 会清零密钥,并且无法撤销,因此下一笔交易需要一个新会话。要保持会话开启多久,请参见整合起来。
主网使用 monad 而不是 monadTestnet。两者均在 viem/chains 中提供。
登录
getPasskeyPrfOutput 会以可发现模式提示 authenticator,用户应该能够选择先前保存的 passkey。
整合起来
有两种方式可以组织这些内容,区别在于密钥在内存中保留的时间长度。保持会话
一次性提示 authenticator,派生密钥,并在用户登录期间一直保持会话。这适合诸如交易之类的高频工作流程,其中每笔交易都提示是行不通的。密钥会在整个会话期间存在于页面内存中,任何页面上的脚本在其存活期间都可以用它签名。disconnect(),并考虑在空闲超时时也调用它。
每笔交易都提示
为每笔交易执行整套流程,并在发送后立即结束会话。密钥仅在发送期间存在,代价是每次都要弹出一个 passkey 提示。using 会在作用域退出时结束会话。如果您的构建目标不支持显式资源管理,请在 finally 块中调用 session.end()。
错误
mera 会抛出带有code 的 MeraError。请使用代码来识别错误,因为消息文本可能会在不同版本之间变化。
注意事项
- passkey 与其创建时使用的
rpId绑定。如果应用迁移到新域名,账户就无法再被派生出来,用户将需要用 24 词助记词来恢复它们。 - 上面的所有内容都是从 passkey 派生密钥。当密钥来自其他地方,比如用户已经拥有的助记词时,secret vaults 会用 passkey 对其加密一次,并解密它。
createEd25519SigningSession和getSolanaAddress可以从同一个 passkey 派生 Solana 账户。

