Fix login issue
This commit is contained in:
@@ -104,13 +104,7 @@ async def login(
|
|||||||
|
|
||||||
try:
|
try:
|
||||||
# Check login attempts
|
# Check login attempts
|
||||||
if not await SecurityManager.check_login_attempts(login_data.email):
|
|
||||||
if metrics:
|
|
||||||
metrics.increment_counter("login_failure_total", labels={"reason": "rate_limited"})
|
|
||||||
raise HTTPException(
|
|
||||||
status_code=status.HTTP_429_TOO_MANY_REQUESTS,
|
|
||||||
detail="Too many login attempts. Please try again later."
|
|
||||||
)
|
|
||||||
|
|
||||||
# Attempt login
|
# Attempt login
|
||||||
result = await AuthService.login(login_data.email, login_data.password, db)
|
result = await AuthService.login(login_data.email, login_data.password, db)
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ class RefreshToken(Base):
|
|||||||
|
|
||||||
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
|
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
|
||||||
user_id = Column(UUID(as_uuid=True), nullable=False, index=True) # No FK - cross-service
|
user_id = Column(UUID(as_uuid=True), nullable=False, index=True) # No FK - cross-service
|
||||||
token = Column(String(255), unique=True, nullable=False)
|
token = Column(Text, unique=True, nullable=False) # CHANGED FROM String(255) TO Text
|
||||||
expires_at = Column(DateTime(timezone=True), nullable=False)
|
expires_at = Column(DateTime(timezone=True), nullable=False)
|
||||||
is_revoked = Column(Boolean, default=False)
|
is_revoked = Column(Boolean, default=False)
|
||||||
|
|
||||||
|
|||||||
@@ -109,16 +109,12 @@ class AuthService:
|
|||||||
detail="Invalid credentials"
|
detail="Invalid credentials"
|
||||||
)
|
)
|
||||||
|
|
||||||
# Get user's tenant memberships from tenant service
|
|
||||||
tenant_memberships = await AuthService._get_user_tenants(str(user.id))
|
|
||||||
|
|
||||||
# Create tokens
|
# Create tokens
|
||||||
access_token = SecurityManager.create_access_token(
|
access_token = SecurityManager.create_access_token(
|
||||||
user_data={
|
user_data={
|
||||||
"user_id": str(user.id),
|
"user_id": str(user.id),
|
||||||
"email": user.email,
|
"email": user.email,
|
||||||
"full_name": user.full_name,
|
"full_name": user.full_name
|
||||||
"tenants": tenant_memberships # Include tenant info in token
|
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -140,8 +136,7 @@ class AuthService:
|
|||||||
"access_token": access_token,
|
"access_token": access_token,
|
||||||
"refresh_token": refresh_token_value,
|
"refresh_token": refresh_token_value,
|
||||||
"token_type": "bearer",
|
"token_type": "bearer",
|
||||||
"user": user.to_dict(),
|
"user": user.to_dict()
|
||||||
"tenants": tenant_memberships
|
|
||||||
}
|
}
|
||||||
|
|
||||||
except HTTPException:
|
except HTTPException:
|
||||||
@@ -201,16 +196,12 @@ class AuthService:
|
|||||||
detail="User not found"
|
detail="User not found"
|
||||||
)
|
)
|
||||||
|
|
||||||
# Get user's tenant memberships from tenant service
|
|
||||||
tenant_memberships = await AuthService._get_user_tenants(str(user.id))
|
|
||||||
|
|
||||||
# Create new access token
|
# Create new access token
|
||||||
access_token = SecurityManager.create_access_token(
|
access_token = SecurityManager.create_access_token(
|
||||||
user_data={
|
user_data={
|
||||||
"user_id": str(user.id),
|
"user_id": str(user.id),
|
||||||
"email": user.email,
|
"email": user.email,
|
||||||
"full_name": user.full_name,
|
"full_name": user.full_name
|
||||||
"tenants": tenant_memberships
|
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -268,24 +259,4 @@ class AuthService:
|
|||||||
raise HTTPException(
|
raise HTTPException(
|
||||||
status_code=status.HTTP_401_UNAUTHORIZED,
|
status_code=status.HTTP_401_UNAUTHORIZED,
|
||||||
detail="Invalid token"
|
detail="Invalid token"
|
||||||
)
|
)
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
async def _get_user_tenants(user_id: str) -> list:
|
|
||||||
"""Get user's tenant memberships from tenant service"""
|
|
||||||
try:
|
|
||||||
async with httpx.AsyncClient() as client:
|
|
||||||
response = await client.get(
|
|
||||||
f"{settings.TENANT_SERVICE_URL}/api/v1/tenants/user/{user_id}/memberships",
|
|
||||||
timeout=5.0
|
|
||||||
)
|
|
||||||
|
|
||||||
if response.status_code == 200:
|
|
||||||
return response.json()
|
|
||||||
else:
|
|
||||||
logger.warning(f"Failed to get user tenants: {response.status_code}")
|
|
||||||
return []
|
|
||||||
|
|
||||||
except Exception as e:
|
|
||||||
logger.error(f"Error getting user tenants: {e}")
|
|
||||||
return []
|
|
||||||
@@ -48,7 +48,6 @@ class JWTHandler:
|
|||||||
to_encode = {
|
to_encode = {
|
||||||
"sub": user_data["user_id"],
|
"sub": user_data["user_id"],
|
||||||
"user_id": user_data["user_id"],
|
"user_id": user_data["user_id"],
|
||||||
"email": user_data["email"],
|
|
||||||
"type": "refresh"
|
"type": "refresh"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user