

Passkeys luar biasa! Hanya pasangan kunci publik/pribadi yang dapat Anda gunakan untuk mengotentikasi dengan situs web (atau aplikasi terkait).
Mereka jauh lebih nyaman daripada kata sandi karena Anda tidak harus mengingat apa pun, atau memilih sesuatu yang memenuhi aturan yang semakin kompleks. Mereka juga lebih aman karena terikat dengan situs yang Anda autentikasi, berpotensi menghilangkan phishing, dan hanya kunci publik yang disimpan di server sehingga tidak ada yang layak dicuri (kunci publik adalah, Anda dapat menebaknya, publik).
Kunci pribadi disimpan oleh Anda. Atau lebih tepatnya, manajer kata sandi Anda, sehingga dapat dibagikan di antara perangkat. Apple, Google, Microsoft dan Amazon secara aktif mendorong penyerapan. Jika Anda menyimpan passkey di manajer kata sandi (seperti DashLane, 1Password atau Apple Keychain), Anda juga dapat membaginya dengan teman.
Mendaftar dengan, dan masuk ke, situs web dan aplikasi, sampai sekarang, menjadi penghalang besar, tetapi dengan passkeys akhirnya terpecahkan. Mari kita terapkan di mana -mana sehingga kita akhirnya dapat mengirimkan kata sandi ke tempat sampah. Passkeys lebih mudah dan lebih aman - apa yang tidak disukai?
Di Red Badger, kami mempertahankan perangkat pengembangan aplikasi multi-platform open source yang disebut Crux. Ini menggunakan karat dan WebAssembly untuk membuatnya mudah dan menyenangkan untuk membangun aplikasi yang berjalan di iOS, Android dan Web (dan baris perintah, dan aplikasi terminal, dan ...).
Crux memungkinkan kami untuk membangun fungsionalitas aplikasi kami sekali, dan mengujinya dalam milidetik, memungkinkan kami untuk memastikan aplikasi kami bekerja dengan benar, dan persis sama, di semua platform.
Repo ini adalah tentang membawa passkeys ke aplikasi crux.
Tidak rumit secara besar -besaran untuk melakukan ini, tetapi ada beberapa langkah untuk pendaftaran dan login yang Anda butuhkan untuk mendapatkan yang benar. Agak sulit untuk menambahkannya ke aplikasi web yang ada (dan aplikasi iOS dan aplikasi Android) dan memastikan bahwa implementasinya benar pada ketiganya. Crux membantu di sini. Kami hanya bisa membangun dan mengujinya sekali.
Direktori shared dalam repo ini, berisi kemampuan passkey crux, yang, bersama dengan kemampuan crux_http , diatur oleh aplikasi auth crux, dengan tes, yang dapat digunakan sebagai "sub-aplikasi"-bersarang di dalam aplikasi crux lain.
Rencana saya sangat bagus - menyatukan teknologi yang sangat keren seperti passkey, karat, websembly, dan inti - tetapi saya ingin lebih.
Jadi saya menambahkan putaran fermyon ke dalam persamaan. Putaran itu bagus! Ini tanpa server tanpa awal yang dingin. Layanan ultra ringan yang dimulai sebagai tanggapan terhadap permintaan yang masuk (dalam mikrodetik) dan mati setelah permintaan telah diproses.
Untuk mendukung Passkeys, kami membutuhkan backend yang memperlihatkan protokol Webauthn. Ini ditulis dalam karat dan dikompilasi untuk WebAssembly ( wasm32-wasi ). Saya harus melompati beberapa lingkaran, seperti vendoring versi OpenSSL yang kompatibel dengan WASM-kami berada di tepi pendarahan di sini-tetapi berhasil!.
Server juga meng -host aplikasi web Leptos yang ditulis dalam karat.
Ini dapat digunakan, seperti apa adanya, ke Fermyon Cloud.
Ubah ke direktori crux-passkey-server :
cd crux-passkey-server Buat file .env dengan konten berikut:
export SPIN_VARIABLE_DOMAIN_LOCAL=localhost
export SPIN_VARIABLE_DOMAIN_REMOTE=crux-passkey-server-8sdh7f6w.fermyon.app # Change this to your own domain Buat sertifikat SSL (lebih disukai dikeluarkan oleh CA tepercaya) dan kunci dan tempatkan di direktori certs . Nama file harus cert.pem dan key.pem . Anda dapat mengikuti instruksi di sini (Anda mungkin perlu menambahkan CA ke toko kepercayaan browser Anda-atau mempercayai mereka di gantungan kunci di macOS-putar 2.0 crash pada penggunaan sertifikat yang ditandatangani sendiri)
Mulai server spin lokal:
./run.shDan kemudian buka browser Anda di https: // localhost
Atau menerbitkan ke Fermyon Cloud (Anda harus memiliki akun Fermyon dan telah menginstal Fermyon CLI):
./cloud_create_db.sh # Only need to do this once
./deploy.shDan kemudian buka browser Anda di https://crux-passkey-server-8sdh7f6w.fermyon.app (atau apapun domain Anda)

Diagram di atas menunjukkan proses pendaftaran.
Pengguna memasukkan alamat email mereka dan mengklik "Register" (Web), atau "Daftar" (aplikasi iOS).
Aplikasi auth , melalui acara GetCreationChallenge dan kemampuan crux_http , mengirimkan permintaan POST ke backend.
Backend merespons dengan objek PublicKeyCredentialCreationOptions , melalui acara CreationChallenge .
Untuk aplikasi iOS, ini dilewati, melalui kemampuan passkey , ke sisi-shell-shell dari implementasi kemampuan passkey , yang menggunakan ASAuthorizationController untuk mendorong pengguna untuk membuat passkey.
Untuk shell web, ini dilewati, melalui kemampuan passkey , ke metode browser. navigator.credentials.create Metode oleh sisi web-shell dari implementasi kemampuan passkey , yang mendorong pengguna untuk membuat passkey.
Pengguna membuat passkey dan kemampuan passkey mengembalikan objek RegisterPublicKeyCredential , melalui acara RegisterCredential , yang berisi kunci publik, tantangan yang ditandatangani, dan informasi lainnya.
Acara RequestCredential ditangani oleh aplikasi, mengirim permintaan POST , melalui kemampuan crux_http , ke backend dengan objek RegisterPublicKeyCredential .
Backend memverifikasi informasi dan mendaftarkan pengguna dengan menyimpan kunci publik pengguna di database itu, menanggapi dengan kode status 201 Created .
Acara CredentialRegistered yang ditangani ditangani oleh aplikasi, yang memperbarui statistiknya untuk menunjukkan bahwa pengguna terdaftar.

Pengguna memasukkan alamat email mereka dan mengklik "Login" (Web), atau "Masuk" (aplikasi iOS).
Aplikasi auth , melalui acara GetRequestChallenge dan kemampuan crux_http , mengirimkan permintaan POST ke backend.
Backend merespons dengan objek PublicKeyCredentialRequestOptions , melalui acara RequestChallenge .
Untuk aplikasi iOS, ini dilewati, melalui kemampuan passkey , ke sisi-shell-shell dari implementasi kemampuan passkey , yang menggunakan ASAuthorizationController untuk meminta pengguna masuk dengan passkey mereka.
Untuk shell web, ini dilewati, melalui kemampuan passkey , ke metode browser. navigator.credentials.get Metode dengan sisi web-shell dari implementasi kemampuan passkey , yang mendorong pengguna untuk masuk dengan passkey mereka.
Pengguna memasuki passkey dan kemampuan passkey mereka mengembalikan objek PublicKeyCredential , melalui acara Credential , yang berisi tantangan yang ditandatangani, dan informasi lainnya.
Acara RequestCredential ditangani oleh aplikasi, mengirim permintaan POST , melalui kemampuan crux_http , ke backend dengan objek PublicKeyCredential .
Backend memverifikasi informasi dan merespons dengan kode status 200 OK .
Acara CredentialVerified ini ditangani oleh aplikasi, yang memperbarui keadaannya untuk menunjukkan bahwa pengguna masuk.
Direktori shared berisi inti dari implementasi. Ini adalah contoh aplikasi crux root yang menyarangkan aplikasi crux auth . Aplikasi auth mengatur kemampuan crux_http dan passkey untuk memberikan pendaftaran passkey dan fungsi login terhadap backend.