

Passkeys ยอดเยี่ยมมาก! เพียงแค่คู่คีย์สาธารณะ/ส่วนตัวที่คุณสามารถใช้เพื่อตรวจสอบสิทธิ์กับเว็บไซต์ (หรือแอพที่เกี่ยวข้อง)
พวกเขาสะดวกกว่ารหัสผ่าน มาก เพราะคุณไม่ต้องจำอะไรเลยหรือเลือกสิ่งที่เป็นไปตามกฎที่ซับซ้อนมากขึ้น พวกเขายังมีความปลอดภัย มากขึ้น เพราะพวกเขาเชื่อมโยงกับเว็บไซต์ที่คุณตรวจสอบความถูกต้องด้วยการกำจัดฟิชชิ่งและมีเพียงคีย์สาธารณะเท่านั้นที่ถูกเก็บไว้ในเซิร์ฟเวอร์ดังนั้นจึงไม่มีอะไรที่คุ้มค่าที่จะขโมย (คีย์สาธารณะคือคุณเดาได้สาธารณะ)
คีย์ส่วนตัวถูกเก็บไว้โดยคุณ หรือค่อนข้างผู้จัดการรหัสผ่านของคุณดังนั้นจึงสามารถแชร์ระหว่างอุปกรณ์ได้ Apple, Google, Microsoft และ Amazon สนับสนุนการดูดซึมอย่างแข็งขัน หากคุณเก็บ passkey ในตัวจัดการรหัสผ่าน (เช่น Dashlane, 1Password หรือ Apple Keychain) คุณสามารถแชร์กับเพื่อนได้
การลงทะเบียนด้วยและเข้าสู่ระบบเว็บไซต์และแอพได้มีอุปสรรคมากมาย แต่ด้วย Passkeys ในที่สุดก็ได้รับการแก้ไข มาใช้กันทุกที่เพื่อให้เราสามารถส่งรหัสผ่านไปยังถังขยะได้ในที่สุด Passkeys ง่ายขึ้นและปลอดภัยกว่า - ไม่ชอบอะไร?
ที่ Red Badger เรารักษาชุดเครื่องมือพัฒนาแอพแบบหลายแพลตฟอร์มโอเพ่นซอร์สที่เรียกว่า CRUX มันใช้ Rust และ WebAssembly เพื่อให้ง่ายและสนุกในการสร้างแอพที่ทำงานบน iOS, Android และเว็บ (และบรรทัดคำสั่งและแอพเทอร์มินัลและ ... )
Crux ช่วยให้เราสามารถสร้าง ฟังก์ชันการทำงาน ของแอพของเราได้ครั้งเดียวและทดสอบเป็นมิลลิวินาทีช่วยให้เราสามารถมั่นใจได้ว่าแอปของเราทำงานได้อย่างถูกต้องและในลักษณะเดียวกันในทุกแพลตฟอร์ม
repo นี้เกี่ยวกับการนำ passkeys ไปยังแอพ crux
มันไม่ซับซ้อนอย่างมากในการทำเช่นนี้ แต่มีขั้นตอนไม่กี่ขั้นตอนสำหรับการลงทะเบียนและการเข้าสู่ระบบที่คุณต้องการเพื่อให้ถูกต้อง มันค่อนข้างยุ่งยากในการเพิ่มลงในเว็บแอปพลิเคชันที่มีอยู่ (และแอพ iOS และแอพ Android) และตรวจสอบให้แน่ใจว่าการใช้งานนั้นถูกต้องทั้งสาม ปมช่วยที่นี่ เราสามารถสร้างและทดสอบได้ครั้งเดียว
ไดเรกทอรี shared ใน repo นี้มีความสามารถในการทำ crux passkey ซึ่งพร้อมกับความสามารถของ crux_http นั้นถูกจัดเตรียมโดยแอพ Auth Auth พร้อมการทดสอบที่สามารถใช้เป็น "Sub-App"-ซ้อนกันภายในแอป CRUX อื่น
แผนของฉันยอดเยี่ยม - นำเทคโนโลยีที่ยอดเยี่ยมมารวมกันเช่น Passkeys, Rust, WebAssembly และ Crux - แต่ฉันต้องการมากกว่านี้
ดังนั้นฉันจึงเพิ่ม Fermyon Spin ลงในสมการ สปินเยี่ยมมาก! มันไม่มีเซิร์ฟเวอร์โดยไม่ต้องเริ่มเย็น บริการน้ำหนักเบาพิเศษที่เริ่มต้นในการตอบสนองต่อคำขอที่เข้ามา (ใน microseconds) และตายหลังจากดำเนินการตามคำขอแล้ว
เพื่อสนับสนุน Passkeys เราจำเป็นต้องมีแบ็กเอนด์ที่เปิดเผยโปรโตคอล WebAuthn มันเขียนด้วยสนิมและรวบรวมไว้ใน webAssembly ( wasm32-wasi ) ฉันต้องกระโดดผ่านห่วงสองสามอย่างเช่นการขาย OpenSSL รุ่นที่เข้ากันได้กับ WASM-เราอยู่บนขอบเลือดที่นี่-แต่มันใช้งานได้!
เซิร์ฟเวอร์ยังโฮสต์แอป Leptos Web ที่เขียนด้วย Rust
สามารถนำไปใช้งานได้เช่นเดียวกับคลาวด์ Fermyon
เปลี่ยนเป็นไดเรกทอรี 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 ลงในร้านค้า Trust ของเบราว์เซอร์-หรือไว้วางใจพวกเขาในพวงกุญแจบน MacOS-Spin 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 (หรือโดเมนของคุณ)

แผนภาพด้านบนแสดงกระบวนการลงทะเบียน
ผู้ใช้ป้อนที่อยู่อีเมลและคลิก "ลงทะเบียน" (เว็บ) หรือ "ลงทะเบียน" (แอพ iOS)
แอพ auth ผ่านเหตุการณ์ GetCreationChallenge และความสามารถ crux_http ส่งคำขอ POST ไปยังแบ็กเอนด์
แบ็กเอนด์ตอบสนองด้วยวัตถุ PublicKeyCredentialCreationOptions ผ่านเหตุการณ์ CreationChallenge
สำหรับแอพ iOS สิ่งนี้จะผ่านผ่านความสามารถของ passkey ไปยังด้าน iOS-shell ของการใช้งานความสามารถของ passkey ซึ่งใช้ ASAuthorizationController เพื่อแจ้งให้ผู้ใช้สร้าง passkey
สำหรับเว็บเชลล์สิ่งนี้จะถูกส่งผ่านผ่านความสามารถของ passkey ไปยัง navigator.credentials.create ของเบราว์เซอร์วิธีการสร้างสรรค์โดย Web-shell ด้านของการใช้งานความสามารถ passkey ซึ่งแจ้งให้ผู้ใช้สร้าง passkey
ผู้ใช้สร้าง passkey และความสามารถของ passkey ส่งคืนวัตถุ RegisterPublicKeyCredential ผ่านเหตุการณ์ RegisterCredential ซึ่งมีคีย์สาธารณะความท้าทายที่ลงนามและข้อมูลอื่น ๆ
เหตุการณ์ RequestCredential ได้รับการจัดการโดยแอปส่งคำขอ POST ผ่านความสามารถ crux_http ไปยังแบ็กเอนด์ด้วยวัตถุ RegisterPublicKeyCredential
แบ็กเอนด์ตรวจสอบข้อมูลและลงทะเบียนผู้ใช้โดยการจัดเก็บคีย์สาธารณะของผู้ใช้ไว้ในฐานข้อมูลโดยตอบกลับด้วยรหัสสถานะ 201 Created
เหตุการณ์ CredentialRegistered ได้รับการจัดการโดยแอปซึ่งอัปเดตสถานะของตนเพื่อระบุว่าผู้ใช้ได้รับการลงทะเบียน

ผู้ใช้ป้อนที่อยู่อีเมลและคลิก "เข้าสู่ระบบ" (เว็บ) หรือ "ลงชื่อเข้าใช้" (แอพ iOS)
แอพ auth ผ่านเหตุการณ์ GetRequestChallenge และความสามารถ crux_http ส่งคำขอ POST ไปยังแบ็กเอนด์
แบ็กเอนด์ตอบสนองด้วยวัตถุ PublicKeyCredentialRequestOptions ผ่านเหตุการณ์ RequestChallenge
สำหรับแอพ iOS สิ่งนี้จะผ่านผ่านความสามารถของ passkey ไปยังด้าน iOS-shell ของการใช้งานความสามารถของ passkey ซึ่งใช้ ASAuthorizationController เพื่อแจ้งให้ผู้ใช้เข้าสู่ระบบด้วย passkey ของพวกเขา
สำหรับเว็บเชลล์สิ่งนี้จะถูกส่งผ่านผ่านความสามารถ passkey ไปยัง navigator.credentials.get ของเบราว์เซอร์เมธอด Get โดยด้าน web-shell ของการใช้งานความสามารถ passkey ซึ่งแจ้งให้ผู้ใช้เข้าสู่ระบบด้วย passkey ของพวกเขา
ผู้ใช้เข้าสู่ Passkey และความสามารถของ passkey ส่งคืนวัตถุ PublicKeyCredential ผ่านเหตุการณ์ Credential ซึ่งมีความท้าทายที่ลงนามและข้อมูลอื่น ๆ
เหตุการณ์ RequestCredential ได้รับการจัดการโดยแอปส่งคำขอ POST ผ่านความสามารถ crux_http ไปยังแบ็กเอนด์กับวัตถุ PublicKeyCredential
แบ็กเอนด์ตรวจสอบข้อมูลและตอบกลับด้วยรหัสสถานะ 200 OK
เหตุการณ์ CredentialVerified รับการจัดการโดยแอพซึ่งอัปเดตสถานะของตนเพื่อระบุว่าผู้ใช้เข้าสู่ระบบ
ไดเรกทอรี shared มีแกนหลักของการใช้งาน มันเป็นตัวอย่างของแอพรูท crux ที่ทำรังแอพ auth Crux แอ auth รับรองความสามารถในการจัดทำ crux_http และความสามารถของ passkey เพื่อให้การลงทะเบียน Passkey และฟังก์ชั่นการเข้าสู่ระบบกับแบ็กเอนด์