diff --git a/docker-compose.yml b/docker-compose.yml index 99f573a..c92ca08 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -11,6 +11,7 @@ services: backend:latest environment: - OPENAI_API_KEY=${OPENAI_API_KEY} + - GOOGLE_CLOUD_PROJECT=truevoice-ff4da postgres: container_name: postgres image: postgres diff --git a/requirements.txt b/requirements.txt index c985e42..e5e3379 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,5 @@ fastapi[standard] psycopg2 scikit-learn -openai \ No newline at end of file +openai +firebase_admin \ No newline at end of file diff --git a/src/handlers/firebase_api_validation_middleware.py b/src/handlers/firebase_api_validation_middleware.py new file mode 100644 index 0000000..3d56d68 --- /dev/null +++ b/src/handlers/firebase_api_validation_middleware.py @@ -0,0 +1,24 @@ +from fastapi import FastAPI, Request, HTTPException +from fastapi.responses import PlainTextResponse +from starlette.middleware.base import BaseHTTPMiddleware +from firebase_admin import app_check +import jwt + +class FirebaseValidationMiddleware(BaseHTTPMiddleware): + async def dispatch(self, request: Request, call_next): + app_check_token = request.headers.get("X-Firebase-AppCheck") + + try: + if not app_check_token: + raise ValueError("X-Firebase-AppCheck token is missing") + + app_check_claims = app_check.verify_token(app_check_token) + + except (ValueError, jwt.exceptions.DecodeError) as ex: + print(str(ex)) + return PlainTextResponse(status_code=401, content="Firebase validation failed.") + + response = await call_next(request) + return response + + diff --git a/src/main.py b/src/main.py index ec7ef5c..5f92e94 100644 --- a/src/main.py +++ b/src/main.py @@ -1,8 +1,10 @@ from typing import List from fastapi.middleware.cors import CORSMiddleware +import firebase_admin from typing import Union from fastapi import FastAPI, Header, Request from src.ai.tv_ai_api import Comment +from src.handlers.firebase_api_validation_middleware import FirebaseValidationMiddleware from src.handlers.response_models import ActivityTopicResponse, CommentResponse, TopicResponse from src.handlers.comment_handler import approve_comment_handler, create_comment_handler, get_pending_comments_handler, reject_comment_handler from src.handlers.request_models import CommentRequest, SessionIdsActivityRequest, SessionIdsTopicsRequest, TopicRequest, VoteRequest @@ -12,6 +14,8 @@ app = FastAPI() +firebase_app = firebase_admin.initialize_app() + # Specify allowed origins origins = [ "http://localhost", # Allow requests from localhost @@ -30,6 +34,10 @@ allow_headers=["*"], # Allow all headers ) +app.add_middleware( + FirebaseValidationMiddleware +) + @app.post("/topic") def create_topic(request: TopicRequest, authorization: Union[str, None] = Header(default=None)) -> TopicResponse: return create_topic_handler(request, authorization)