todo_chatbot / src /api /auth.py
Awais68
Deploy FastAPI backend with MCP and OpenAI agents
cccf200
Raw
History Blame Contribute Delete
3.23 kB
"""
Authentication API endpoints (register, login, logout).
"""
from fastapi import APIRouter, Depends, HTTPException, status, Request, Header
from sqlmodel import Session, select
from src.db.session import get_session
from src.models.user import UserCreate, UserLogin, UserResponse, User
from src.services.user_service import UserService
from src.core.security import create_access_token
from src.middleware.auth import get_current_user
from pydantic import BaseModel
router = APIRouter(prefix="/auth", tags=["auth"])
class TokenResponse(BaseModel):
"""Response model for token exchange."""
access_token: str
token_type: str
user: dict
@router.post("/exchange-token", response_model=TokenResponse)
async def exchange_token(
request: Request,
session: Session = Depends(get_session),
x_user_email: str = Header(None, alias="X-User-Email"),
x_user_name: str = Header(None, alias="X-User-Name"),
x_user_id: str = Header(None, alias="X-User-Id")
):
"""
Exchange Better Auth session for JWT token.
Called by frontend after Better Auth login.
Better Auth should provide user info in headers:
- X-User-Email: User's email
- X-User-Name: User's name
- X-User-Id: Better Auth user ID
"""
# Try to get user info from headers first
user_email = x_user_email
user_name = x_user_name
better_auth_id = x_user_id
# If not in headers, try to get from Better Auth session cookie
if not user_email:
# Get Better Auth session from cookies
session_cookie = request.cookies.get('better-auth.session_token')
if not session_cookie:
raise HTTPException(
status_code=401,
detail="No session found. Please login first."
)
# In a real implementation, you would verify the session with Better Auth
# For now, we'll require the headers to be sent from frontend
raise HTTPException(
status_code=400,
detail="User information headers required (X-User-Email, X-User-Name)"
)
# Get or create user in backend DB
query = select(User).where(User.email == user_email)
user = session.exec(query).first()
if not user:
# Create new user from Better Auth data
user = User(
email=user_email,
name=user_name or user_email.split('@')[0],
is_active=True
)
session.add(user)
session.commit()
session.refresh(user)
# Generate JWT token
access_token = create_access_token(data={"sub": user.id})
return TokenResponse(
access_token=access_token,
token_type="bearer",
user={
"id": user.id,
"email": user.email,
"name": user.name if hasattr(user, 'name') else user.email.split('@')[0] # Fallback if 'name' isn't set
}
)
@router.get("/verify-token")
async def verify_token(
current_user: User = Depends(lambda: None) # Will add proper dependency later
):
"""
Verify JWT token is valid.
Returns current user info.
"""
return {"status": "valid", "message": "Token verification endpoint"}