feat: redesign Login/Register with HUD aesthetic and Google Auth integration

This commit is contained in:
2026-02-22 15:31:02 -05:00
parent c6b97c4188
commit 33154169c8
12 changed files with 1116 additions and 419 deletions

View File

@ -8,8 +8,17 @@ from app.core.database import get_session
from app.core.security import verify_password, get_password_hash, create_access_token, get_token_payload
from app.models.user import User, DriverProfile, UserRole, VehicleType
from app.api.deps import oauth2_scheme
from app.schemas.user import PassengerCreate, Token, UserResponse, LoginRequest
from app.schemas.user import PassengerCreate, Token, UserResponse, LoginRequest, GoogleLoginRequest
import firebase_admin
from firebase_admin import auth as firebase_auth, credentials
# Initialize Firebase Admin
try:
if not firebase_admin._apps:
# Default initialization (uses GOOGLE_APPLICATION_CREDENTIALS)
firebase_admin.initialize_app()
except Exception as e:
print(f"WARNING: Firebase Admin could not be initialized: {e}")
router = APIRouter(prefix="/api/auth", tags=["auth"])
@ -60,6 +69,62 @@ async def login(
}
@router.post("/google", response_model=Token)
async def google_login(
data: GoogleLoginRequest,
session: Session = Depends(get_session)
):
try:
# Verify the ID token sent by the frontend
decoded_token = firebase_auth.verify_id_token(data.id_token)
email = decoded_token.get("email")
full_name = decoded_token.get("name", "")
profile_photo = decoded_token.get("picture", "")
# Check if user exists
user = session.exec(select(User).where(User.email == email)).first()
if not user:
# Create new user if it doesn't exist (Passenger as default)
user = User(
email=email,
full_name=full_name,
hashed_password=get_password_hash(str(uuid4())), # Random pass, won't be used
role=UserRole.PASSENGER,
profile_photo_url=profile_photo,
is_verified=True
)
session.add(user)
session.commit()
session.refresh(user)
print(f"DEBUG: Created new user via Google: {email}")
# Create access token
import datetime
expires = datetime.timedelta(days=30)
access_token = create_access_token(
subject=user.id,
role=user.role,
full_name=user.full_name,
expires_delta=expires
)
return {
"access_token": access_token,
"token_type": "bearer",
"role": user.role,
"full_name": user.full_name,
"profile_photo_url": user.profile_photo_url
}
except Exception as e:
print(f"DEBUG: Google Login failed: {e}")
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail=f"Invalid Google Token: {str(e)}",
headers={"WWW-Authenticate": "Bearer"},
)
@router.post("/register/passenger", response_model=UserResponse)
async def register_passenger(
data: PassengerCreate,

View File

@ -53,6 +53,10 @@ class LoginRequest(BaseModel):
keep_session: bool = False
class GoogleLoginRequest(BaseModel):
id_token: str
class Token(BaseModel):
access_token: str
token_type: str