

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註冊和登錄功能。