@@ -161,14 +161,20 @@ def passkey_register_complete(request):
161161 name = (data .get ("name" ) or "" ).strip ()[:128 ] or timezone .now ().strftime (
162162 "Passkey %Y-%m-%d"
163163 )
164- Passkey .objects .create (
165- user = request .user ,
166- name = name ,
167- credential_id = bytes_to_base64url (verification .credential_id ),
168- public_key = bytes_to_base64url (verification .credential_public_key ),
169- sign_count = verification .sign_count ,
170- transports = data ["response" ].get ("transports" , []),
171- )
164+ try :
165+ Passkey .objects .create (
166+ user = request .user ,
167+ name = name ,
168+ credential_id = bytes_to_base64url (verification .credential_id ),
169+ public_key = bytes_to_base64url (verification .credential_public_key ),
170+ sign_count = verification .sign_count ,
171+ transports = data ["response" ].get ("transports" , []),
172+ )
173+ except Exception :
174+ logger .warning (
175+ "Failed to save passkey for user %s" , request .user .pk , exc_info = True
176+ )
177+ return JsonResponse ({"error" : _ ("Could not save passkey" )}, status = 500 )
172178 logger .info ("Passkey registered for user %s (name=%r)" , request .user .pk , name )
173179 return JsonResponse ({"status" : "ok" })
174180
@@ -204,6 +210,10 @@ def passkey_auth_complete(request):
204210
205211 try :
206212 credential_id_b64 = bytes_to_base64url (base64url_to_bytes (data ["rawId" ]))
213+ raw_user_handle = data ["response" ].get ("userHandle" )
214+ user_handle_bytes = (
215+ base64url_to_bytes (raw_user_handle ) if raw_user_handle else None
216+ )
207217 except Exception :
208218 return JsonResponse ({"error" : _ ("Invalid credential" )}, status = 400 )
209219
@@ -215,12 +225,10 @@ def passkey_auth_complete(request):
215225 .get (credential_id = credential_id_b64 )
216226 )
217227
218- user_handle = data ["response" ].get ("userHandle" )
219- if user_handle :
220- if base64url_to_bytes (user_handle ) != str (passkey .user .pk ).encode ():
221- return JsonResponse (
222- {"error" : _ ("User handle mismatch" )}, status = 400
223- )
228+ if user_handle_bytes is not None :
229+ if user_handle_bytes != str (passkey .user .pk ).encode ():
230+ raise InvalidAuthenticationResponse ("User handle mismatch" )
231+
224232 credential = AuthenticationCredential (
225233 id = data ["id" ],
226234 raw_id = base64url_to_bytes (data ["rawId" ]),
@@ -232,9 +240,7 @@ def passkey_auth_complete(request):
232240 data ["response" ]["authenticatorData" ]
233241 ),
234242 signature = base64url_to_bytes (data ["response" ]["signature" ]),
235- user_handle = base64url_to_bytes (user_handle )
236- if user_handle
237- else None ,
243+ user_handle = user_handle_bytes ,
238244 ),
239245 )
240246 verification = verify_authentication_response (
0 commit comments