Spaces:
Running
Running
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 +6 -2
- backend/routers/auth.py +38 -1
backend/middleware/auth.py
CHANGED
|
@@ -125,9 +125,13 @@ class ConditionalAuthMiddleware(BaseHTTPMiddleware):
|
|
| 125 |
user = None
|
| 126 |
try:
|
| 127 |
user = request.session.get("user")
|
| 128 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 129 |
# Session middleware not available or not configured
|
| 130 |
-
logger.
|
| 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 |
-
|
| 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}
|