fix auth
This commit is contained in:
+13
-11
@@ -153,26 +153,28 @@ async def mcp_protocol_handler(request: Request):
|
|||||||
from clerk_backend_api import Clerk, models
|
from clerk_backend_api import Clerk, models
|
||||||
import jwt
|
import jwt
|
||||||
|
|
||||||
# First, decode JWT token without verification to get session_id
|
# Decode JWT token and extract user info
|
||||||
try:
|
try:
|
||||||
decoded_token = jwt.decode(token, options={"verify_signature": False})
|
decoded_token = jwt.decode(token, options={"verify_signature": False})
|
||||||
session_id = decoded_token.get("sid") # Use standard JWT 'sid' claim
|
user_id = decoded_token.get("user_id") or decoded_token.get("sub")
|
||||||
user_id = decoded_token.get("sub") or decoded_token.get("user_id")
|
user_email = decoded_token.get("email")
|
||||||
|
token_scopes = decoded_token.get("scopes", ["read", "search"])
|
||||||
|
session_id = decoded_token.get("sid", "jwt_session")
|
||||||
|
|
||||||
logger.info(f"JWT token claims - session_id: {session_id}, user_id: {user_id}")
|
logger.info(f"JWT token claims - user_id: {user_id}, email: {user_email}, scopes: {token_scopes}")
|
||||||
|
|
||||||
if user_id:
|
if user_id and user_email:
|
||||||
# For real JWT tokens, we can trust the token if it's properly formatted
|
# JWT token is signed by Clerk and contains valid user info
|
||||||
# Additional validation can be added here
|
|
||||||
request.state.user_id = user_id
|
request.state.user_id = user_id
|
||||||
request.state.session_id = session_id or "unknown"
|
request.state.user_email = user_email
|
||||||
request.state.token_scopes = ["read", "search"]
|
request.state.session_id = session_id
|
||||||
|
request.state.token_scopes = token_scopes
|
||||||
logger.info(f"Real JWT token accepted for user: {user_id}")
|
logger.info(f"Real JWT token accepted for user: {user_id}")
|
||||||
else:
|
else:
|
||||||
logger.error("No user_id found in JWT token")
|
logger.error(f"Missing required fields in JWT token - user_id: {bool(user_id)}, email: {bool(user_email)}")
|
||||||
raise HTTPException(
|
raise HTTPException(
|
||||||
status_code=401,
|
status_code=401,
|
||||||
detail="Invalid token - no user_id in claims"
|
detail="Invalid token - missing user_id or email in claims"
|
||||||
)
|
)
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
|
|||||||
+13
-27
@@ -119,40 +119,26 @@ async def oauth_callback(
|
|||||||
|
|
||||||
if clerk_token and CLERK_AVAILABLE:
|
if clerk_token and CLERK_AVAILABLE:
|
||||||
try:
|
try:
|
||||||
clerk = Clerk(bearer_auth=os.getenv("CLERK_SECRET_KEY"))
|
# Extract user info from JWT token (no Clerk session verification needed)
|
||||||
|
|
||||||
# Extract session_id from JWT token (use 'sid' claim - standard JWT claim)
|
|
||||||
import jwt
|
import jwt
|
||||||
decoded_token = jwt.decode(clerk_token, options={"verify_signature": False})
|
decoded_token = jwt.decode(clerk_token, options={"verify_signature": False})
|
||||||
session_id = decoded_token.get("sid") # Use standard JWT 'sid' claim
|
user_id = decoded_token.get("user_id") or decoded_token.get("sub")
|
||||||
|
user_email = decoded_token.get("email")
|
||||||
|
token_scopes = decoded_token.get("scopes", ["read", "search"])
|
||||||
|
|
||||||
if session_id:
|
logger.info(f"JWT token claims - user_id: {user_id}, email: {user_email}, scopes: {token_scopes}")
|
||||||
# Verify with Clerk using session_id
|
|
||||||
session = clerk.sessions.verify(session_id=session_id, token=clerk_token)
|
|
||||||
user_id = session.user_id if session else None
|
|
||||||
|
|
||||||
if user_id:
|
if user_id and user_email:
|
||||||
user_authenticated = True
|
# JWT token is already signed by Clerk and contains valid user info
|
||||||
logger.info(f"User authenticated via JWT - user_id: {user_id}")
|
user_authenticated = True
|
||||||
|
logger.info(f"User authenticated via JWT token - user_id: {user_id}")
|
||||||
|
|
||||||
# Generate real JWT token from session using template
|
# Use the JWT token directly as the real token (it's already from Clerk template)
|
||||||
try:
|
real_jwt_token = clerk_token
|
||||||
real_jwt_token = clerk.sessions.create_token_from_template(
|
logger.info("Using Clerk JWT token directly (already real token)")
|
||||||
session_id=session_id,
|
|
||||||
template_name="mcp_auth"
|
|
||||||
)
|
|
||||||
logger.info("Real JWT token generated from template")
|
|
||||||
except Exception as e:
|
|
||||||
logger.warning(f"Failed to generate JWT from template: {e}")
|
|
||||||
# Fallback to regular token creation
|
|
||||||
real_jwt_token = clerk.sessions.create_token(
|
|
||||||
session_id=session_id,
|
|
||||||
expires_in_seconds=3600
|
|
||||||
)
|
|
||||||
logger.info("Real JWT token generated (fallback)")
|
|
||||||
|
|
||||||
else:
|
else:
|
||||||
logger.error("No session_id found in JWT token")
|
logger.error(f"Missing required fields in JWT token - user_id: {bool(user_id)}, email: {bool(user_email)}")
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f"JWT validation failed: {e}")
|
logger.error(f"JWT validation failed: {e}")
|
||||||
|
|||||||
Reference in New Issue
Block a user