From a987f47988db1d5a5160236f573c9e6e9ce19a29 Mon Sep 17 00:00:00 2001 From: Leo Vasanko Date: Fri, 1 Aug 2025 13:48:38 -0600 Subject: [PATCH] Fixes to backend API changes. The whole app is mostly functional. --- passkey/fastapi/session.py | 4 ++-- passkey/fastapi/ws.py | 10 +++++----- passkey/sansio.py | 6 ++++-- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/passkey/fastapi/session.py b/passkey/fastapi/session.py index 62e8af5..66d1996 100644 --- a/passkey/fastapi/session.py +++ b/passkey/fastapi/session.py @@ -12,7 +12,7 @@ This module provides session management functionality including: from datetime import datetime, timedelta from uuid import UUID -from fastapi import Request, Response +from fastapi import Request, Response, WebSocket from ..db import Session, sql from ..util import passphrase @@ -25,7 +25,7 @@ def expires() -> datetime: return datetime.now() + EXPIRES -def infodict(request: Request, type: str) -> dict: +def infodict(request: Request | WebSocket, type: str) -> dict: """Extract client information from request.""" return { "ip": request.client.host if request.client else "", diff --git a/passkey/fastapi/ws.py b/passkey/fastapi/ws.py index e8805ad..be4e2ca 100644 --- a/passkey/fastapi/ws.py +++ b/passkey/fastapi/ws.py @@ -13,7 +13,7 @@ from datetime import datetime from uuid import UUID import uuid7 -from fastapi import Cookie, FastAPI, Query, Request, WebSocket, WebSocketDisconnect +from fastapi import Cookie, FastAPI, Query, WebSocket, WebSocketDisconnect from webauthn.helpers.exceptions import InvalidAuthenticationResponse from passkey.fastapi import session @@ -54,7 +54,7 @@ async def register_chat( @app.websocket("/register") async def websocket_register_new( - request: Request, ws: WebSocket, user_name: str = Query(""), auth=Cookie(None) + ws: WebSocket, user_name: str = Query(""), auth=Cookie(None) ): """Register a new user and with a new passkey credential.""" await ws.accept() @@ -75,7 +75,7 @@ async def websocket_register_new( user_uuid=user_uuid, key=session_key(token), expires=datetime.now() + session.EXPIRES, - info=infodict(request, "authenticated"), + info=infodict(ws, "authenticated"), credential_uuid=credential.uuid, ) @@ -142,7 +142,7 @@ async def websocket_register_add(ws: WebSocket, token: str | None = None): @app.websocket("/authenticate") -async def websocket_authenticate(request: Request, ws: WebSocket): +async def websocket_authenticate(ws: WebSocket): await ws.accept() origin = ws.headers.get("origin") try: @@ -161,7 +161,7 @@ async def websocket_authenticate(request: Request, ws: WebSocket): assert stored_cred.uuid is not None token = await create_session( user_uuid=stored_cred.user_uuid, - info=infodict(request, "auth"), + info=infodict(ws, "auth"), credential_uuid=stored_cred.uuid, ) diff --git a/passkey/sansio.py b/passkey/sansio.py index d81c801..0471658 100644 --- a/passkey/sansio.py +++ b/passkey/sansio.py @@ -11,6 +11,7 @@ import json from datetime import datetime from uuid import UUID +import uuid7 from webauthn import ( generate_authentication_options, generate_registration_options, @@ -112,7 +113,7 @@ class Passkey: self, response_json: dict | str, expected_challenge: bytes, - user_id: UUID, + user_uuid: UUID, origin: str | None = None, ) -> Credential: """ @@ -133,8 +134,9 @@ class Passkey: expected_rp_id=self.rp_id, ) return Credential( + uuid=uuid7.create(), credential_id=credential.raw_id, - user_id=user_id, + user_uuid=user_uuid, aaguid=UUID(registration.aaguid), public_key=registration.credential_public_key, sign_count=registration.sign_count,