wu981526092 commited on
Commit
dbeb044
·
1 Parent(s): ceaf757

Fix session persistence and add detailed debugging

Browse files

- Enhance session save/verification in OAuth callback
- Add comprehensive session debugging in auth middleware
- Create debug endpoint to inspect session state
- Improve error handling for session access failures
- Add auth_method field to user data for better tracking

backend/middleware/auth.py CHANGED
@@ -125,9 +125,13 @@ class ConditionalAuthMiddleware(BaseHTTPMiddleware):
125
  user = None
126
  try:
127
  user = request.session.get("user")
128
- except (AttributeError, AssertionError):
 
 
 
 
129
  # Session middleware not available or not configured
130
- logger.debug("Session not available for authentication check")
131
  user = None
132
 
133
  # In HF Spaces, check for __sign parameter which indicates HF has pre-authenticated the user
 
125
  user = None
126
  try:
127
  user = request.session.get("user")
128
+ if user:
129
+ logger.info(f"🔓 Found authenticated user in session: {user.get('username', 'unknown')}")
130
+ else:
131
+ logger.debug(f"🔍 No user found in session for {request.url.path}")
132
+ except (AttributeError, AssertionError) as e:
133
  # Session middleware not available or not configured
134
+ logger.error(f"Session access failed: {e}")
135
  user = None
136
 
137
  # In HF Spaces, check for __sign parameter which indicates HF has pre-authenticated the user
backend/routers/auth.py CHANGED
@@ -179,15 +179,31 @@ async def oauth_callback(request: Request, code: str, state: str):
179
  raise HTTPException(status_code=400, detail="Failed to fetch user information")
180
 
181
  # Store user in session
182
- request.session["user"] = {
183
  "id": user_info.get("id"),
184
  "name": user_info.get("name"),
185
  "username": user_info.get("login"), # HF username
186
  "email": user_info.get("email"),
187
  "avatar_url": user_info.get("avatarUrl"),
188
  "access_token": access_token, # Store for future API calls if needed
 
189
  }
190
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
191
  # Clean up state
192
  request.session.pop("oauth_state", None)
193
 
@@ -303,3 +319,24 @@ async def login_page(request: Request):
303
  """
304
 
305
  return HTMLResponse(content=html_content)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
179
  raise HTTPException(status_code=400, detail="Failed to fetch user information")
180
 
181
  # Store user in session
182
+ user_data = {
183
  "id": user_info.get("id"),
184
  "name": user_info.get("name"),
185
  "username": user_info.get("login"), # HF username
186
  "email": user_info.get("email"),
187
  "avatar_url": user_info.get("avatarUrl"),
188
  "access_token": access_token, # Store for future API calls if needed
189
+ "auth_method": "oauth"
190
  }
191
 
192
+ try:
193
+ request.session["user"] = user_data
194
+ logger.info(f"💾 User data saved to session: {user_data['username']}")
195
+
196
+ # Verify session was saved
197
+ stored_user = request.session.get("user")
198
+ if stored_user:
199
+ logger.info(f"✅ Session verification successful: {stored_user['username']}")
200
+ else:
201
+ logger.error("❌ Session verification failed - user not found after saving")
202
+
203
+ except Exception as e:
204
+ logger.error(f"❌ Failed to save user to session: {e}")
205
+ raise HTTPException(status_code=500, detail="Session save failed")
206
+
207
  # Clean up state
208
  request.session.pop("oauth_state", None)
209
 
 
319
  """
320
 
321
  return HTMLResponse(content=html_content)
322
+
323
+
324
+ @router.get("/debug")
325
+ async def debug_session(request: Request):
326
+ """Debug endpoint to check session state."""
327
+ try:
328
+ session_data = dict(request.session) if hasattr(request, 'session') else {}
329
+ user = request.session.get("user") if hasattr(request, 'session') else None
330
+
331
+ return {
332
+ "session_available": hasattr(request, 'session'),
333
+ "session_data_keys": list(session_data.keys()),
334
+ "user_in_session": bool(user),
335
+ "user_info": {
336
+ "username": user.get("username") if user else None,
337
+ "auth_method": user.get("auth_method") if user else None
338
+ } if user else None,
339
+ "request_state_user": bool(getattr(request.state, "user", None)),
340
+ }
341
+ except Exception as e:
342
+ return {"error": str(e), "session_available": False}