

Passkeys很棒!您可以使用一个公共/私钥对来验证网站(或关联的应用程序)。
它们比密码更方便,因为您不必记住任何东西,也不必选择满足日益复杂规则的内容。它们也更加安全,因为它们与您正在认证的网站相关,可能会消除网络钓鱼,并且只有一个公共密钥存储在服务器上,因此没有什么值得窃取的(公共密钥是,您猜对了,公开了)。
私钥由您保留。或更确切地说,您的密码管理器可以在设备之间共享。苹果,谷歌,微软和亚马逊正在积极鼓励吸收。如果您将PassKey存储在密码管理器中(例如Dashlane,1Password或Apple键链),也可以与朋友共享。
到目前为止,注册并登录网站和应用程序已经是一个巨大的障碍,但是有了Passkeys,它终于解决了。让我们到处实施它们,以便我们最终可以将密码委托到垃圾箱。 Passkeys更容易,更安全 - 不喜欢什么?
在Red Badger,我们维护开源的多平台应用程序开发工具包称为Crux。它使用Rust和WebAssembly来使构建在iOS,Android和Web(以及命令行,终端应用程序以及...)上运行的应用程序变得容易且有趣。
CRUX允许我们一次构建应用程序的功能,并以毫秒为单位进行测试,使我们能够在所有平台上确保应用程序正常工作,并且完全相同。
此存储库是关于将Passkeys带到Crux应用程序。
这样做并不是很复杂,但是您需要正确正确的注册和登录步骤。将其添加到现有的Web应用程序(以及iOS应用程序和Android应用程序)并确保实现在这三个方面都是正确的,这有点棘手。关键在这里有所帮助。我们可以构建和测试一次。
此存储库中的shared目录包含一个Crux Passkey功能,该功能与crux_http功能一起由Crux auth应用程序协调,并带有测试,可以用作“ sub-app” - 嵌套在另一个Crux应用程序中。
我的计划很棒 - 将真正的很酷的技术汇集在一起,例如Passkeys,Rust,WebAssembly和Crux - 但我想要更多。
因此,我在方程式中添加了Fermyon旋转。旋转很棒!它是无服务的,没有冷启动。响应传入的请求(以微秒为单位)而启动的超轻型服务并在处理请求后死亡。
为了支持PassKeys,我们需要一个揭示WebAuthn协议的后端。它用Rust编写,并编译为WebAssembly( wasm32-wasi )。我不得不跳过几个篮球,例如供应WASM兼容版本的OpenSSL - 我们在这里处于出血边缘 - 但它可以工作!
该服务器还托管了用Rust编写的Leptos Web应用程序。
它可以像Fermyon Cloud一样部署。
更改为crux-passkey-server目录:
cd crux-passkey-server创建一个带有以下内容的.env文件:
export SPIN_VARIABLE_DOMAIN_LOCAL=localhost
export SPIN_VARIABLE_DOMAIN_REMOTE=crux-passkey-server-8sdh7f6w.fermyon.app # Change this to your own domain创建一个SSL证书(最好由受信任的CA发行),然后将其放入certs目录中。文件名应为cert.pem和key.pem 。您可以在此处遵循说明(您可能需要将CA添加到浏览器的信任商店中,或者在MacOS上的KeyChain中信任它们 - 使用自签名证书时旋转2.0崩溃)
启动本地旋转服务器:
./run.sh然后在https:// localhost打开浏览器
或发布到Fermyon Cloud(您需要拥有一个Fermyon帐户并安装了Fermyon CLI):
./cloud_create_db.sh # Only need to do this once
./deploy.sh然后在https://crux-passkey-server-8sdh7f6w.fermyon.app上打开浏览器

上图显示了注册过程。
用户输入其电子邮件地址,然后单击“注册”(Web)或“注册”(iOS应用程序)。
通过GetCreationChallenge事件和crux_http功能, auth应用程序将POST请求发送给后端。
后端通过CreationChallenge事件以PublicKeyCredentialCreationOptions对象做出响应。
对于iOS应用程序,通过passkey功能将其传递给passkey功能实现的iOS壳侧,该实现使用ASAuthorizationController提示用户创建PassKey。
对于Web Shell,通过passkey功能将其传递给浏览器的navigator.credentials.create方法,通过passkey功能实现的Web shell端,这提示用户创建PassKey。
用户创建一个PassKey,并且passkey功能通过RegisterCredential事件返回RegisterPublicKeyCredential对象,该事件包含公共密钥,签名挑战和其他信息。
该RequestCredential事件由应用程序处理,通过crux_http功能发送POST请求,并使用RegisterPublicKeyCredential对象将其发送到后端。
后端通过将用户的公共密钥存储在数据库中,并以201 Created状态代码响应来验证信息并注册用户。
CredentialRegistered事件由该应用程序处理,该应用程序更新其状态以表明用户已注册。

用户输入其电子邮件地址,然后单击“登录”(Web)或“登录”(iOS应用程序)。
通过GetRequestChallenge事件和crux_http功能, auth App将POST请求发送给后端。
后端通过RequestChallenge事件以PublicKeyCredentialRequestOptions对象做出响应。
对于iOS应用程序,通过passkey功能将其传递给passkey功能实现的iOS壳侧,该实现使用ASAuthorizationController提示用户使用PassKey登录。
对于Web Shell,通过passkey功能将其传递给浏览器的navigator.credentials.get方法,通过passkey功能实现的Web shell侧,这会提示用户使用PassKey登录。
用户进入他们的PassKey,并且passkey功能通过Credential事件返回一个PublicKeyCredential对象,其中包含签名挑战和其他信息。
该RequestCredential事件由应用程序处理,通过crux_http功能将POST请求发送到使用PublicKeyCredential对象的后端。
后端验证信息并使用200 OK状态代码响应。
CredentialVerified事件由该应用程序处理,该应用程序更新其状态以表明用户已登录。
shared目录包含实现的核心。这是一个嵌套auth Crux应用程序的root Crux应用程序的示例。 auth应用程序精心策划crux_http和passkey功能,以提供有关后端的Passkey注册和登录功能。