@@ -66,7 +66,6 @@ def generate_device_code(self) -> str:
6666
6767 def generate_user_code (self ) -> str :
6868 """Generate a user-friendly code in format ABC-420."""
69-
7069 letters = '' .join (secrets .choice (string .ascii_uppercase ) for _ in range (3 ))
7170 digits = '' .join (secrets .choice (string .digits ) for _ in range (3 ))
7271 return f"{ letters } -{ digits } "
@@ -197,6 +196,8 @@ def get_device_code_poll_status(self, device_code: str) -> Optional[Dict[str, An
197196 - expired: {"status": "expired", "error": "device_code_expired"}
198197 - denied: {"status": "denied", "error": "user_denied_authorization"}
199198 - not_found: None (treat as expired)
199+
200+ Tokens are deleted after retrieval (one-time use).
200201 """
201202 entry = self .get_device_code_entry (device_code )
202203
@@ -209,12 +210,14 @@ def get_device_code_poll_status(self, device_code: str) -> Optional[Dict[str, An
209210 status = entry .get ("status" , "pending" )
210211
211212 if status == "authorized" :
212- return {
213+ result = {
213214 "status" : "authorized" ,
214215 "user_id" : entry .get ("user_id" ),
215216 "id_token" : entry .get ("id_token" ),
216217 "refresh_token" : entry .get ("refresh_token" )
217218 }
219+ self ._delete_session (device_code , entry )
220+ return result
218221 elif status == "denied" :
219222 return {
220223 "status" : "denied" ,
@@ -244,10 +247,7 @@ def delete_device_code(self, device_code: str) -> bool:
244247 return False
245248
246249 def verify_firebase_token (self , id_token : str ) -> Optional [Dict [str , Any ]]:
247- """Verify Firebase ID token from website/plugin.
248-
249- Note: Firebase Admin SDK is initialized at server startup in http_server.py.
250- """
250+ """Verify Firebase ID token from website/plugin."""
251251 try :
252252 decoded_token = auth .verify_id_token (id_token )
253253 return {
0 commit comments