Skip to content

Commit 1b61e0b

Browse files
committed
login and logout functionality
1 parent da41302 commit 1b61e0b

File tree

3 files changed

+71
-2
lines changed

3 files changed

+71
-2
lines changed

backend/app/middleware/auth.py

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
import logging
2+
from fastapi import Depends, HTTPException, Security
3+
from fastapi.security import HTTPAuthorizationCredentials, HTTPBearer
4+
import firebase_admin.auth
5+
from ..services.implementations.user_service import UserService
6+
from ..utilities.db_utils import get_db
7+
8+
security = HTTPBearer()
9+
logger = logging.getLogger(__name__)
10+
11+
async def get_current_user(
12+
credentials: HTTPAuthorizationCredentials = Security(security),
13+
db = Depends(get_db)
14+
):
15+
"""
16+
Validates the authorization token and returns the current user
17+
"""
18+
try:
19+
# Remove 'Bearer ' prefix
20+
token = credentials.credentials
21+
logger.info(f"Attempting to verify token: {token[:20]}...")
22+
23+
# Verify the token with Firebase
24+
decoded_token = firebase_admin.auth.verify_id_token(token)
25+
logger.info(f"Decoded token UID: {decoded_token.get('uid')}")
26+
27+
# Get user from database using Firebase UID
28+
user_service = UserService(db)
29+
user = user_service.get_user_id_by_auth_id(decoded_token['uid'])
30+
31+
if not user:
32+
logger.error(f"No user found for auth_id: {decoded_token['uid']}")
33+
raise HTTPException(
34+
status_code=401,
35+
detail="User not found in database"
36+
)
37+
38+
return user
39+
40+
except firebase_admin.auth.InvalidIdTokenError as e:
41+
logger.error(f"Invalid token: {str(e)}")
42+
raise HTTPException(
43+
status_code=401,
44+
detail=f"Invalid token: {str(e)}"
45+
)
46+
except Exception as e:
47+
logger.error(f"Authentication error: {str(e)}")
48+
raise HTTPException(
49+
status_code=401,
50+
detail=str(e)
51+
)

backend/app/routes/auth.py

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from ..services.implementations.auth_service import AuthService
55
from ..services.implementations.user_service import UserService
66
from ..utilities.db_utils import get_db
7+
from ..middleware.auth import get_current_user
78
import logging
89

910
router = APIRouter(prefix="/auth", tags=["auth"])
@@ -12,9 +13,23 @@ def get_auth_service(db: Session = Depends(get_db)):
1213
logger = logging.getLogger(__name__)
1314
return AuthService(logger=logger, user_service=UserService(db))
1415

16+
1517
@router.post("/login", response_model=AuthResponse)
1618
async def login(
1719
credentials: LoginRequest,
1820
auth_service: AuthService = Depends(get_auth_service)
1921
):
20-
return auth_service.generate_token(credentials.email, credentials.password)
22+
return auth_service.generate_token(credentials.email, credentials.password)
23+
24+
25+
@router.post("/logout")
26+
async def logout(
27+
current_user = Depends(get_current_user),
28+
auth_service: AuthService = Depends(get_auth_service)
29+
):
30+
try:
31+
auth_service.revoke_tokens(current_user.id)
32+
return {"message": "Successfully logged out"}
33+
except Exception as e:
34+
raise HTTPException(status_code=500, detail=str(e))
35+

backend/app/utilities/firebase_rest_client.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,10 @@ def sign_in_with_password(self, email, password):
6363

6464
raise Exception("Failed to sign-in via Firebase REST API")
6565

66-
return Token(response_json["idToken"], response_json["refreshToken"])
66+
return Token(
67+
access_token=response_json["idToken"],
68+
refresh_token=response_json["refreshToken"]
69+
)
6770

6871
# docs: https://firebase.google.com/docs/reference/rest/auth/#section-sign-in-with-oauth-credential
6972
def sign_in_with_google(self, id_token):

0 commit comments

Comments
 (0)