Update mcp_auth_http_adapter.py

This commit is contained in:
saidsurucu
2025-07-02 03:07:33 +03:00
parent a29a624598
commit 13ed5b3c67
+14 -74
View File
@@ -134,79 +134,21 @@ async def authorize_endpoint(
@router.get("/auth/callback")
async def oauth_callback(
request: Request,
state: Optional[str] = Query(None),
__session: Optional[str] = Query(None),
__client_uat: Optional[str] = Query(None)
state: Optional[str] = Query(None)
):
"""Handle OAuth callback from Clerk - verify authentication and issue code"""
"""Handle OAuth callback from Clerk - simplified for custom domains"""
logger.info(f"OAuth callback received - state: {state}")
logger.info(f"Query params: {dict(request.query_params)}")
logger.info(f"Cookies: {dict(request.cookies)}")
# Check if we have Clerk SDK
if not CLERK_AVAILABLE:
logger.error("Clerk SDK not available")
return JSONResponse(
status_code=500,
content={"error": "server_error", "error_description": "Clerk SDK not available"}
)
# For Clerk custom domains, we'll assume authentication succeeded
# if Clerk redirected the user to our callback URL
# Get Clerk session from cookies or query params
session_token = request.cookies.get("__session") or __session
client_uat = request.cookies.get("__client_uat") or __client_uat
# Initialize Clerk SDK
clerk_secret = os.getenv("CLERK_SECRET_KEY")
if not clerk_secret:
logger.error("CLERK_SECRET_KEY not configured")
return JSONResponse(
status_code=500,
content={"error": "server_error", "error_description": "Clerk not configured"}
)
clerk = Clerk(bearer_auth=clerk_secret)
# For custom domains, we'll skip complex session verification
# and rely on the fact that Clerk only redirects here after successful auth
try:
# Verify the session with Clerk SDK
session = None
user = None
if session_token:
try:
# Verify session token with Clerk
logger.info("Verifying session token with Clerk SDK")
session = clerk.sessions.verify_token(
token=session_token,
session_token=session_token
)
logger.info(f"Session verified: {session.id if hasattr(session, 'id') else 'unknown'}")
# Get user info
if hasattr(session, 'user_id'):
user = clerk.users.get(user_id=session.user_id)
logger.info(f"User authenticated: {user.id}")
except Exception as e:
logger.warning(f"Session verification failed: {e}")
# If no valid session, check client UAT (User Authentication Token)
if not session and client_uat:
try:
logger.info("Verifying client UAT with Clerk SDK")
# Try to get current user with client token
clients = clerk.clients.verify_token(token=client_uat)
if clients and hasattr(clients, 'sessions') and clients.sessions:
session = clients.sessions[0]
logger.info(f"Client session found: {session.id}")
except Exception as e:
logger.warning(f"Client UAT verification failed: {e}")
if not session:
logger.error("No valid Clerk session found")
return JSONResponse(
status_code=401,
content={"error": "unauthorized", "error_description": "No valid Clerk session found"}
)
# Extract session ID from state
if not state:
logger.error("No state parameter provided")
return JSONResponse(
@@ -220,7 +162,7 @@ async def oauth_callback(
original_state, session_id = state.rsplit(":", 1)
else:
original_state = state
session_id = None
session_id = state # Fallback
except ValueError:
logger.error(f"Invalid state format: {state}")
return JSONResponse(
@@ -237,25 +179,23 @@ async def oauth_callback(
raise HTTPException(status_code=500, detail="OAuth provider not configured")
# Get stored session
oauth_session = None
if session_id:
oauth_session = oauth_provider.storage.get_session(session_id)
if not oauth_session:
logger.error(f"OAuth session not found for ID: {session_id}")
return JSONResponse(
status_code=400,
content={"error": "invalid_request", "error_description": "OAuth session not found"}
content={"error": "invalid_request", "error_description": "OAuth session expired or not found"}
)
# Generate authorization code
auth_code = f"clerk_{session.id}_{session_id}"
# Generate simple authorization code for custom domain flow
auth_code = f"clerk_custom_{session_id}_{int(time.time())}"
# Store the code mapping for token exchange
code_data = {
"session_id": session_id,
"clerk_session_id": session.id if hasattr(session, 'id') else None,
"user_id": session.user_id if hasattr(session, 'user_id') else None,
"clerk_authenticated": True,
"custom_domain_flow": True,
"created_at": time.time(),
"expires_at": (datetime.utcnow() + timedelta(minutes=5)).timestamp(),
}