Update mcp_auth_http_adapter.py
This commit is contained in:
+14
-74
@@ -134,79 +134,21 @@ async def authorize_endpoint(
|
|||||||
@router.get("/auth/callback")
|
@router.get("/auth/callback")
|
||||||
async def oauth_callback(
|
async def oauth_callback(
|
||||||
request: Request,
|
request: Request,
|
||||||
state: Optional[str] = Query(None),
|
state: Optional[str] = Query(None)
|
||||||
__session: Optional[str] = Query(None),
|
|
||||||
__client_uat: 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"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
|
# For Clerk custom domains, we'll assume authentication succeeded
|
||||||
if not CLERK_AVAILABLE:
|
# if Clerk redirected the user to our callback URL
|
||||||
logger.error("Clerk SDK not available")
|
|
||||||
return JSONResponse(
|
|
||||||
status_code=500,
|
|
||||||
content={"error": "server_error", "error_description": "Clerk SDK not available"}
|
|
||||||
)
|
|
||||||
|
|
||||||
# Get Clerk session from cookies or query params
|
# For custom domains, we'll skip complex session verification
|
||||||
session_token = request.cookies.get("__session") or __session
|
# and rely on the fact that Clerk only redirects here after successful auth
|
||||||
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)
|
|
||||||
|
|
||||||
try:
|
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:
|
if not state:
|
||||||
logger.error("No state parameter provided")
|
logger.error("No state parameter provided")
|
||||||
return JSONResponse(
|
return JSONResponse(
|
||||||
@@ -220,7 +162,7 @@ async def oauth_callback(
|
|||||||
original_state, session_id = state.rsplit(":", 1)
|
original_state, session_id = state.rsplit(":", 1)
|
||||||
else:
|
else:
|
||||||
original_state = state
|
original_state = state
|
||||||
session_id = None
|
session_id = state # Fallback
|
||||||
except ValueError:
|
except ValueError:
|
||||||
logger.error(f"Invalid state format: {state}")
|
logger.error(f"Invalid state format: {state}")
|
||||||
return JSONResponse(
|
return JSONResponse(
|
||||||
@@ -237,25 +179,23 @@ async def oauth_callback(
|
|||||||
raise HTTPException(status_code=500, detail="OAuth provider not configured")
|
raise HTTPException(status_code=500, detail="OAuth provider not configured")
|
||||||
|
|
||||||
# Get stored session
|
# 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:
|
if not oauth_session:
|
||||||
logger.error(f"OAuth session not found for ID: {session_id}")
|
logger.error(f"OAuth session not found for ID: {session_id}")
|
||||||
return JSONResponse(
|
return JSONResponse(
|
||||||
status_code=400,
|
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
|
# Generate simple authorization code for custom domain flow
|
||||||
auth_code = f"clerk_{session.id}_{session_id}"
|
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 = {
|
code_data = {
|
||||||
"session_id": session_id,
|
"session_id": session_id,
|
||||||
"clerk_session_id": session.id if hasattr(session, 'id') else None,
|
"clerk_authenticated": True,
|
||||||
"user_id": session.user_id if hasattr(session, 'user_id') else None,
|
"custom_domain_flow": True,
|
||||||
"created_at": time.time(),
|
"created_at": time.time(),
|
||||||
"expires_at": (datetime.utcnow() + timedelta(minutes=5)).timestamp(),
|
"expires_at": (datetime.utcnow() + timedelta(minutes=5)).timestamp(),
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user