diff --git a/auth.py b/auth.py index 6dce2ad..3d724bc 100644 --- a/auth.py +++ b/auth.py @@ -4,12 +4,17 @@ from fastapi.responses import RedirectResponse from sqlalchemy.orm import Session import httpx from database import get_db, User +from itsdangerous import URLSafeTimedSerializer # IMPORTANT: These must be replaced with your actual Twitch application credentials TWITCH_CLIENT_ID = "YOUR_TWITCH_CLIENT_ID" TWITCH_CLIENT_SECRET = "YOUR_TWITCH_CLIENT_SECRET" REDIRECT_URI = "http://localhost:8000/auth/twitch/callback" +# IMPORTANT: This should be a long, random string kept secret in a production environment +SECRET_KEY = "YOUR_SECRET_KEY" +serializer = URLSafeTimedSerializer(SECRET_KEY) + router = APIRouter() @router.get("/login/twitch") @@ -75,5 +80,9 @@ async def auth_twitch_callback(code: str, db: Session = Depends(get_db)): user.twitch_refresh_token = refresh_token # TODO: Encrypt this db.commit() - # TODO: Set a session cookie to keep the user logged in - return {"message": f"Successfully logged in as {twitch_username}"} + # Create a session cookie + response = RedirectResponse(url="/dashboard") + session_data = {"user_id": user.id} + session_cookie = serializer.dumps(session_data) + response.set_cookie(key="session", value=session_cookie) + return response diff --git a/dashboard.html b/dashboard.html new file mode 100644 index 0000000..4432e57 --- /dev/null +++ b/dashboard.html @@ -0,0 +1,22 @@ + + +
+This is your personalized dashboard. You can manage your connected accounts and configure your overlay here.
+ +Use this URL as a browser source in your streaming software:
+ + + + + diff --git a/main.py b/main.py index 3fec21b..6303ab7 100644 --- a/main.py +++ b/main.py @@ -1,14 +1,38 @@ import asyncio import json -from fastapi import FastAPI, WebSocket -from fastapi.responses import HTMLResponse +from fastapi import FastAPI, WebSocket, Request, Depends +from fastapi.responses import HTMLResponse, RedirectResponse from starlette.websockets import WebSocketDisconnect +from starlette.middleware.base import BaseHTTPMiddleware +from sqlalchemy.orm import Session from chat_listeners import listen_youtube_chat, listen_twitch_chat -from auth import router as auth_router # Import the auth router +from auth import router as auth_router, serializer +from database import get_db, User app = FastAPI() +class SessionMiddleware(BaseHTTPMiddleware): + async def dispatch(self, request: Request, call_next): + response = await call_next(request) + session_cookie = request.cookies.get("session") + if session_cookie: + try: + data = serializer.loads(session_cookie, max_age=3600 * 24 * 7) # 1 week + db = next(get_db()) + user = db.query(User).filter(User.id == data["user_id"]).first() + request.state.user = user + except Exception: + request.state.user = None + else: + request.state.user = None + return response + +app.add_middleware(SessionMiddleware) + +def get_current_user(request: Request): + return request.state.user + app.include_router(auth_router, prefix="/auth") # Include the auth router connected_clients = [] @@ -40,6 +64,13 @@ async def get_login_page(): with open("login.html", "r") as f: return f.read() +@app.get("/dashboard", response_class=HTMLResponse) +async def get_dashboard(user: User = Depends(get_current_user)): + if not user: + return RedirectResponse(url="/login") + with open("dashboard.html", "r") as f: + return f.read() + @app.get("/overlay", response_class=HTMLResponse) async def get_overlay(): with open("index.html", "r") as f: