Update mcp_auth_http_adapter.py
This commit is contained in:
+16
-76
@@ -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)
|
||||
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
|
||||
# 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(),
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user