

패스 키는 굉장합니다! 웹 사이트 (또는 관련 앱)와 함께 인증하는 데 사용할 수있는 공개/개인 키 쌍 만 있습니다.
아무것도 기억할 필요가 없거나 점점 더 복잡한 규칙을 만족시키는 것을 선택할 필요가 없기 때문에 암호보다 훨씬 편리합니다. 그들은 또한 당신이 인증하고있는 사이트에 묶여 있고 피싱을 제거하고, 공개 키만 서버에 저장되므로 도둑질 할 가치가 없기 때문에 더 안전합니다 (공개 키는 공개적으로 공개적으로).
개인 키는 귀하에 의해 유지됩니다. 또는 오히려 비밀번호 관리자가 있으므로 장치간에 공유 할 수 있습니다. Apple, Google, Microsoft 및 Amazon은 적극적으로 섭취를 장려하고 있습니다. Passkey를 암호 관리자 (예 : Dashlane, 1Password 또는 Apple Keychain)에 저장하면 친구와 공유 할 수 있습니다.
웹 사이트와 앱에 등록하고 로그인하는 것은 지금까지 큰 장벽 이었지만 패스 키를 사용하면 마침내 해결되었습니다. 우리는 마침내 빈에 암호를 위탁 할 수 있도록 모든 곳에서 구현합시다. 패스 키는 더 쉽고 안전합니다. 좋아하지 않는 것은 무엇입니까?
Red Badger에서는 Crux라는 오픈 소스 멀티 플랫폼 앱 개발 툴킷을 유지 관리합니다. Rust 및 WebAssembly를 사용하여 iOS, Android 및 웹에서 실행되는 앱 (및 명령 줄 및 터미널 앱 및 ...)에서 실행되는 앱을 쉽고 재미있게 만들 수 있습니다.
Crux를 사용하면 앱의 기능을 한 번만 구축하고 밀리 초로 테스트하여 모든 플랫폼에서 앱에서 정확히 동일한 방식으로 작동하는지 확인할 수 있습니다.
이 저장소는 패스 키를 Crux 앱으로 가져 오는 것입니다.
이 작업을 수행하는 것은 엄청나게 복잡하지는 않지만 등록 및 로그인을 모두 제대로 해야하는 몇 가지 단계가 있습니다. 기존 웹 애플리케이션 (및 iOS 앱 및 Android 앱)에 추가하고 구현이 세 가지 모두에 올바른지 확인하는 것은 약간 까다로워집니다. Crux는 여기서 도움이됩니다. 한 번만 구축하고 테스트 할 수 있습니다.
이 repo의 shared 디렉토리에는 Crux Passkey 기능이 포함되어 있으며 crux_http 기능과 함께 Tests와 함께 Crux Auth 앱으로 조정되어 다른 Crux 앱 내부에 중첩 될 수 있습니다.
저의 계획은 훌륭했습니다. 패스 키, 녹, webassembly 및 crux와 같은 정말 멋진 기술을 모으는 것입니다. 그러나 나는 더 많은 것을 원했습니다.
그래서 나는 페르미온 스핀을 방정식에 추가했습니다. 스핀은 훌륭합니다! 콜드 스타트가없는 서버리스입니다. 들어오는 요청 (마이크로 초)에 대한 응답으로 시작된 울트라 경량 서비스는 요청이 처리 된 후에 죽습니다.
Passkeys를 지원하려면 WebAuthn 프로토콜을 노출시키는 백엔드가 필요합니다. Rust로 작성되어 WebAssembly ( wasm32-wasi )에 편집되었습니다. 나는 OpenSSL의 WASM 호환 버전을 공급하는 것과 같이 몇 개의 후프를 뛰어 넘어야했습니다.
서버는 또한 Rust로 작성된 Leptos 웹 앱을 호스팅합니다.
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에서 발행)를 만들고 Key를 작성하여 certs 디렉토리에 배치하십시오. 파일 이름은 cert.pem 및 key.pem 이어야합니다. 여기에서 지침을 따를 수 있습니다 (CA를 브라우저의 신뢰 스토어에 추가하거나 MACOS의 Keychain에서 신뢰해야 할 수도 있습니다.
로컬 스핀 서버 시작 :
./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 앱)을 클릭합니다.
GetCreationChallenge 이벤트와 crux_http 기능을 통해 auth 앱은 백엔드에 POST 요청을 보냅니다.
백엔드는 CreationChallenge 이벤트를 통해 PublicKeyCredentialCreationOptions 객체로 응답합니다.
iOS 앱의 경우 passkey 기능을 통해 passkey 기능 구현의 iOS-SHELL 측면으로 전달되며, 이는 ASAuthorizationController 사용하여 사용자가 PassKey를 생성하도록 프롬프트합니다.
웹 쉘의 경우 passkey 기능을 통해 Browser의 navigator.credentials.create Methods에 따라 passkey 기능 구현의 웹 쉘 측면에 의해 전달되어 사용자에게 PassKey를 만들도록 유도합니다.
사용자는 PassKey를 생성하고 passkey 기능은 공개 키, 서명 챌린지 및 기타 정보를 포함하는 RegisterCredential 이벤트를 통해 RegisterPublicKeyCredential 객체를 반환합니다.
RequestCredential 이벤트는 앱에서 처리하여 crux_http 기능을 통해 POST 요청을 RegisterPublicKeyCredential 객체와 함께 백엔드로 전송합니다.
백엔드는 정보를 검증하고 사용자의 공개 키를 데이터베이스에 저장하여 사용자를 등록하여 201 Created 상태 코드로 응답합니다.
CredentialRegistered 이벤트는 앱에서 처리하여 상태를 업데이트하여 사용자가 등록되었음을 나타냅니다.

사용자는 이메일 주소를 입력하고 "로그인"(웹) 또는 "로그인"(iOS 앱)을 클릭합니다.
GetRequestChallenge 이벤트와 crux_http 기능을 통해 auth 앱은 백엔드에 POST 요청을 보냅니다.
백엔드는 RequestChallenge 이벤트를 통해 PublicKeyCredentialRequestOptions 객체로 응답합니다.
iOS 앱의 경우 passkey 기능을 통해 PassKey 기능 구현의 iOS-SHELL 측면으로 전달됩니다. passkey 기능 구현의 iOS-Shell 측면으로 ASAuthorizationController 사용하여 사용자가 PassKey로 로그인하도록 프롬프트합니다.
웹 쉘의 경우, 이것은 passkey 기능을 통해 Browser의 navigator.credentials.get 메소드로 전달됩니다. passkey 기능 구현의 웹 쉘 측면에서 메소드를 사용하여 사용자가 PassKey로 로그인하도록 유도합니다.
사용자는 PassKey를 입력하고 passkey 기능은 서명 된 챌린지 및 기타 정보를 포함하는 Credential 이벤트를 통해 PublicKeyCredential 객체를 반환합니다.
RequestCredential 이벤트는 앱에서 처리하여 crux_http 기능을 통해 POUBLE PublicKeyCredential 객체와 백엔드로 POST 요청을 보냅니다.
백엔드는 정보를 확인하고 200 OK 상태 코드로 응답합니다.
CredentialVerified 이벤트는 앱에 의해 처리되며, 이는 상태를 업데이트하여 사용자가 로그인되었음을 나타냅니다.
shared 디렉토리에는 구현의 핵심이 포함되어 있습니다. 인증 크 럭스 앱을 중첩하는 auth 크 룩스 앱의 예입니다. auth 앱은 crux_http 및 passkey 기능을 오케스트레이션하여 백엔드에 대한 PassKey 등록 및 로그인 기능을 제공합니다.