REFACTOR API gateway fix 7
This commit is contained in:
@@ -46,25 +46,51 @@ class AuthService:
|
||||
full_name=full_name,
|
||||
is_active=True,
|
||||
is_verified=False,
|
||||
created_at=datetime.now(timezone.utc)
|
||||
created_at=datetime.now(timezone.utc),
|
||||
language='es', # Default language from logs
|
||||
timezone='Europe/Madrid' # Default timezone from logs
|
||||
)
|
||||
|
||||
db.add(new_user)
|
||||
await db.flush() # Get user ID without committing
|
||||
|
||||
# ✅ FIX 2: Create complete user_data for token generation
|
||||
complete_user_data = {
|
||||
# ✅ FIX 1: Create COMPLETE and CONSISTENT user_data for token generation
|
||||
token_user_data = {
|
||||
"user_id": str(new_user.id),
|
||||
"email": new_user.email,
|
||||
"email": new_user.email, # ✅ Ensure email is included
|
||||
"full_name": new_user.full_name,
|
||||
"is_verified": new_user.is_verified
|
||||
"is_verified": new_user.is_verified,
|
||||
"is_active": new_user.is_active
|
||||
}
|
||||
|
||||
# Generate tokens with complete user data
|
||||
access_token = SecurityManager.create_access_token(user_data=complete_user_data)
|
||||
logger.debug(f"Creating tokens for user: {email} with data: {token_user_data}")
|
||||
|
||||
# ✅ FIX 2: Generate tokens with VALIDATED user data
|
||||
try:
|
||||
access_token = SecurityManager.create_access_token(user_data=token_user_data)
|
||||
logger.debug(f"Access token created successfully for {email}")
|
||||
except Exception as token_error:
|
||||
logger.error(f"Access token creation failed for {email}: {token_error}")
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
||||
detail=f"Token creation failed: {token_error}"
|
||||
)
|
||||
|
||||
# ✅ FIX 3: Pass complete user data for refresh token too
|
||||
refresh_token_value = SecurityManager.create_refresh_token(user_data=complete_user_data)
|
||||
# ✅ FIX 3: Create refresh token with minimal but complete data
|
||||
refresh_token_data = {
|
||||
"user_id": str(new_user.id),
|
||||
"email": new_user.email # Include email for consistency
|
||||
}
|
||||
|
||||
try:
|
||||
refresh_token_value = SecurityManager.create_refresh_token(user_data=refresh_token_data)
|
||||
logger.debug(f"Refresh token created successfully for {email}")
|
||||
except Exception as refresh_error:
|
||||
logger.error(f"Refresh token creation failed for {email}: {refresh_error}")
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
||||
detail=f"Refresh token creation failed: {refresh_error}"
|
||||
)
|
||||
|
||||
# Store refresh token in database
|
||||
refresh_token = RefreshToken(
|
||||
@@ -75,9 +101,12 @@ class AuthService:
|
||||
)
|
||||
|
||||
db.add(refresh_token)
|
||||
await db.commit()
|
||||
|
||||
# Publish registration event
|
||||
# ✅ FIX 4: Only commit after ALL token creation succeeds
|
||||
await db.commit()
|
||||
await db.refresh(new_user)
|
||||
|
||||
# Publish registration event (non-blocking)
|
||||
try:
|
||||
await publish_user_registered({
|
||||
"user_id": str(new_user.id),
|
||||
@@ -88,7 +117,7 @@ class AuthService:
|
||||
except Exception as e:
|
||||
logger.warning(f"Failed to publish registration event: {e}")
|
||||
|
||||
logger.info(f"User registered with tokens: {email}")
|
||||
logger.info(f"User registered successfully with tokens: {email}")
|
||||
|
||||
# Return unified token response format
|
||||
return {
|
||||
@@ -112,9 +141,10 @@ class AuthService:
|
||||
except Exception as e:
|
||||
await db.rollback()
|
||||
logger.error(f"Registration with tokens failed for {email}: {e}")
|
||||
# ✅ FIX 5: Provide more specific error information
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
||||
detail="Registration failed"
|
||||
detail=f"Registration failed: {str(e)}"
|
||||
)
|
||||
|
||||
@staticmethod
|
||||
@@ -170,7 +200,7 @@ class AuthService:
|
||||
|
||||
@staticmethod
|
||||
async def login(email: str, password: str, db: AsyncSession) -> Dict[str, Any]:
|
||||
"""Login user and return tokens (UNCHANGED)"""
|
||||
"""Login user and return tokens - FIXED VERSION"""
|
||||
try:
|
||||
# Get user
|
||||
result = await db.execute(select(User).where(User.email == email))
|
||||
@@ -182,19 +212,27 @@ class AuthService:
|
||||
detail="Invalid credentials"
|
||||
)
|
||||
|
||||
# Create tokens (standard lifespan for verified login)
|
||||
access_token = SecurityManager.create_access_token(
|
||||
user_data={
|
||||
"user_id": str(user.id),
|
||||
"email": user.email,
|
||||
"full_name": user.full_name,
|
||||
"is_verified": user.is_verified
|
||||
}
|
||||
)
|
||||
# ✅ FIX 1: Create COMPLETE user data for access token
|
||||
access_token_data = {
|
||||
"user_id": str(user.id),
|
||||
"email": user.email, # ✅ Include email
|
||||
"full_name": user.full_name,
|
||||
"is_verified": user.is_verified,
|
||||
"is_active": user.is_active
|
||||
}
|
||||
|
||||
refresh_token_value = SecurityManager.create_refresh_token(
|
||||
user_data={"user_id": str(user.id)}
|
||||
)
|
||||
# ✅ FIX 2: Create COMPLETE user data for refresh token
|
||||
refresh_token_data = {
|
||||
"user_id": str(user.id),
|
||||
"email": user.email # ✅ Include email for consistency
|
||||
}
|
||||
|
||||
logger.debug(f"Creating access token for login with data: {list(access_token_data.keys())}")
|
||||
logger.debug(f"Creating refresh token for login with data: {list(refresh_token_data.keys())}")
|
||||
|
||||
# Create tokens with complete data
|
||||
access_token = SecurityManager.create_access_token(user_data=access_token_data)
|
||||
refresh_token_value = SecurityManager.create_refresh_token(user_data=refresh_token_data)
|
||||
|
||||
# Store refresh token in database
|
||||
refresh_token = RefreshToken(
|
||||
@@ -207,15 +245,13 @@ class AuthService:
|
||||
db.add(refresh_token)
|
||||
await db.commit()
|
||||
|
||||
# Publish login event
|
||||
# Publish login event (non-blocking)
|
||||
try:
|
||||
await publish_user_login(
|
||||
{
|
||||
await publish_user_login({
|
||||
"user_id": str(user.id),
|
||||
"email": user.email,
|
||||
"login_at": datetime.now(timezone.utc).isoformat()
|
||||
}
|
||||
)
|
||||
})
|
||||
except Exception as e:
|
||||
logger.warning(f"Failed to publish login event: {e}")
|
||||
|
||||
@@ -237,9 +273,11 @@ class AuthService:
|
||||
}
|
||||
|
||||
except HTTPException:
|
||||
await db.rollback()
|
||||
raise
|
||||
except Exception as e:
|
||||
logger.error(f"Login error for {email}: {e}")
|
||||
await db.rollback()
|
||||
logger.error(f"Login failed for {email}: {e}")
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
||||
detail="Login failed"
|
||||
|
||||
Reference in New Issue
Block a user