

パスキーは素晴らしいです! Webサイト(または関連するアプリ)で認証するために使用できるパブリック/プライベートキーペア。
何も覚えておく必要がないか、ますます複雑なルールを満たすものを選択する必要がないため、パスワードよりもはるかに便利です。彼らはあなたが認証しているサイトに結び付けられており、潜在的にフィッシングを排除する可能性があるため、より安全です。そして、サーバーに公開鍵のみが保存されるため、盗む価値はありません(公開鍵は、あなたが推測しました、公開)。
秘密鍵はあなたによって保持されています。むしろ、パスワードマネージャーを使用するため、デバイス間で共有できます。 Apple、Google、Microsoft、Amazonは、積極的に摂取を奨励しています。パスワードマネージャー(Dashlane、1Password、Appleキーチェーンなど)にPassKeyを保存すると、友達と共有することもできます。
Webサイトやアプリに登録してログインすることは、これまで大きな障壁でしたが、PassKeysを使用すると最終的に解決されました。最終的にパスワードをビンに委託できるように、どこにでも実装しましょう。 PassKeysはより簡単で安全です - 何が気に入らないのですか?
Red Badgerでは、Cruxと呼ばれるオープンソースのマルチプラットフォームアプリ開発ツールキットを維持しています。 RustとWebAssemblyを使用して、iOS、Android、Web(およびコマンドライン、ターミナルアプリなどで実行されるアプリを簡単に構築できます。
Cruxを使用すると、アプリの機能を一度構築し、ミリ秒単位でテストすることで、すべてのプラットフォームでアプリが正しく同じように機能するようになります。
このレポは、PassKeysをCruxアプリに持ち込むことです。
これを行うのはそれほど複雑ではありませんが、登録とログインの両方に正しい手順が必要です。既存のWebアプリケーション(およびiOSアプリとAndroidアプリ)に追加し、3つすべてで実装が正しいことを確認するのは少し難しいです。ここでクロックスが役立ちます。一度構築してテストすることができます。
このリポジトリのsharedディレクトリには、Crux_HTTP機能とともに、「サブアプリ」として使用できるcrux_http機能とともに、Crux Authアプリによって組織化されているCrux PassKey機能が含まれています。
私の計画は素晴らしかった - Passkeys、Rust、WebSosembly、Cruxなどの本当にクールな技術を結びつける - しかし、私はもっと欲しかった。
そこで、Fermyonスピンを方程式に追加しました。スピンは素晴らしいです!コールドスタートなしのサーバーレスです。 (マイクロ秒単位で)着信要求に応じて開始され、リクエストが処理された後に死亡する超軽量サービス。
PassKeysをサポートするには、WebAuthNプロトコルを公開するバックエンドが必要です。 Rustで書かれ、WebAssembly( wasm32-wasi )にコンパイルされています。 OpenSSLのWASM互換バージョンのベンダーのように、私はいくつかのフープを飛び越えなければなりませんでした。
サーバーは、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 CERT(できれば信頼できるCAによって発行されることが好ましい)を作成し、キーを作成し、 certsディレクトリに配置します。ファイル名はcert.pem and key.pemでなければなりません。ここで指示に従うことができます(ブラウザのトラストストアにCAを追加する必要がある場合があります。または、MacOSのキーチェーンでそれらを信頼する必要があります。
ローカルスピンサーバーを開始します。
./run.sh次に、https:// localhostでブラウザを開きます
または、Fermyon Cloudに公開します(Fermyonアカウントが必要で、Fermyon CLIをインストールする必要があります):
./cloud_create_db.sh # Only need to do this once
./deploy.shhttps://crux-passkey-server-8SDH7f6w.fermyon.app(またはドメインが何であれ)でブラウザを開きます

上の図は、登録プロセスを示しています。
ユーザーはメールアドレスを入力し、「登録」(Web)または「サインアップ」(iOSアプリ)をクリックします。
authアプリは、 GetCreationChallengeイベントとcrux_http機能を介して、バックエンドにPOSTリクエストを送信します。
BackEndは、 CreationChallengeイベントを介して、 PublicKeyCredentialCreationOptionsオブジェクトで応答します。
iOSアプリの場合、これはpasskey機能を介して、 passkey機能実装のiOS-Shell側に渡されます。これは、 ASAuthorizationControllerを使用してユーザーにPassKeyの作成を促します。
Webシェルの場合、これはpasskey機能を介して、Browserのnavigator.credentials.createメソッドに渡され、 passkey機能実装のWeb-Shell側に渡され、ユーザーがPassKeyを作成するように促します。
ユーザーはPassKeyを作成し、 passkey機能は、公開キー、署名されたチャレンジ、その他の情報を含むRegisterCredentialイベントを介して、 RegisterPublicKeyCredentialオブジェクトを返します。
RequestCredentialイベントは、アプリによって処理され、 crux_http機能を介してPOSTリクエストを送信して、 RegisterPublicKeyCredentialオブジェクトでバックエンドに送信します。
バックエンドは情報を検証し、ユーザーの公開キーをデータベースに保存してユーザーを登録し、 201 Createdステータスコードで応答します。
CredentialRegisteredイベントはアプリによって処理され、その状態を更新して、ユーザーが登録されていることを示します。

ユーザーはメールアドレスを入力し、「ログイン」(Web)または「サインイン」(iOSアプリ)をクリックします。
authアプリは、 GetRequestChallengeイベントとcrux_http機能を介して、バックエンドにPOSTリクエストを送信します。
バックエンドは、 RequestChallengeイベントを介して、 PublicKeyCredentialRequestOptionsオブジェクトで応答します。
iOSアプリの場合、これはpasskey機能を介して、 passkey機能実装のiOS-Shell側に渡されます。これは、 ASAuthorizationControllerを使用してユーザーにPassKeyでログインするように促します。
Webシェルの場合、これはpasskey機能を介して、 passkey機能実装のWebシェル側でブラウザのnavigator.credentials.getメソッドに渡され、ユーザーがPassKeyでログインするように促します。
ユーザーはPassKeyを入力し、 passkey機能は、署名されたチャレンジやその他の情報を含むCredentialイベントを介して、 PublicKeyCredentialオブジェクトを返します。
RequestCredentialイベントは、アプリによって処理され、 crux_http機能を介してPublicKeyCredentialオブジェクトでバックエンドにPOSTリクエストを送信します。
バックエンドは情報を検証し、 200 OKステータスコードで応答します。
CredentialVerifiedイベントはアプリによって処理され、その状態を更新して、ユーザーがログインしていることを示します。
sharedディレクトリには、実装のコアが含まれています。これは、 auth CruxアプリをネストするRoot Cruxアプリの例です。 auth Appは、 crux_httpとpasskey機能を調整して、バックエンドに対してパスキー登録とログイン機能を提供します。