feat: redesign Login/Register with HUD aesthetic and Google Auth integration
This commit is contained in:
@ -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,
|
||||
|
||||
@ -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
|
||||
|
||||
Reference in New Issue
Block a user