55 lines
1.7 KiB
Python
55 lines
1.7 KiB
Python
from fastapi import FastAPI, Depends, HTTPException, Request, Response
|
|
from fastapi.responses import RedirectResponse, JSONResponse
|
|
from app.cabletv.utils.auth import get_current_user, exchange_code_for_token
|
|
from fastapi.middleware.cors import CORSMiddleware
|
|
from starlette.middleware.sessions import SessionMiddleware
|
|
|
|
app = FastAPI()
|
|
|
|
# Add CORS middleware
|
|
app.add_middleware(
|
|
CORSMiddleware,
|
|
allow_origins=["*"],
|
|
allow_credentials=True,
|
|
allow_methods=["*"],
|
|
allow_headers=["*"],
|
|
)
|
|
|
|
# Add session middleware
|
|
app.add_middleware(SessionMiddleware, secret_key="your-secret-key")
|
|
|
|
@app.get("/protected")
|
|
async def protected_route(request: Request, user = Depends(get_current_user)):
|
|
return {"message": "Protected content", "user": user['Username']}
|
|
|
|
@app.get("/auth/callback")
|
|
async def auth_callback(request: Request, code: str):
|
|
try:
|
|
redirect_uri = str(request.base_url)
|
|
tokens = exchange_code_for_token(code, redirect_uri)
|
|
|
|
# For browser requests, redirect to protected page
|
|
is_browser = "text/html" in request.headers.get("accept", "")
|
|
if is_browser:
|
|
response = RedirectResponse(url="/protected")
|
|
else:
|
|
response = JSONResponse(content={
|
|
"message": "Authentication successful",
|
|
"id_token": tokens["id_token"]
|
|
})
|
|
|
|
# Set the token cookie
|
|
response.set_cookie(
|
|
key="token",
|
|
value=tokens["id_token"],
|
|
httponly=True,
|
|
secure=True,
|
|
samesite="lax"
|
|
)
|
|
|
|
return response
|
|
except Exception as e:
|
|
raise HTTPException(
|
|
status_code=400,
|
|
detail=f"Authentication failed: {str(e)}"
|
|
) |