Hydra-Bolt
commited on
Commit
·
92daf66
1
Parent(s):
bbfff2e
fixed
Browse files- app/auth/routes.py +0 -8
- app/middleware/__init__.py +2 -34
app/auth/routes.py
CHANGED
|
@@ -287,10 +287,6 @@ async def refresh_token(request: Request, token_data: TokenRefreshRequest):
|
|
| 287 |
new_access_token = auth_middleware.create_access_token(data={"sub": user.id})
|
| 288 |
new_refresh_token = auth_middleware.create_refresh_token(data={"sub": user.id})
|
| 289 |
|
| 290 |
-
# Blacklist old refresh token
|
| 291 |
-
expires_at = datetime.fromtimestamp(payload.get("exp", 0))
|
| 292 |
-
auth_middleware.blacklist_token(token_data.refresh_token, expires_at)
|
| 293 |
-
|
| 294 |
# Create new session
|
| 295 |
await create_user_session(user.id, new_access_token, new_refresh_token, request)
|
| 296 |
|
|
@@ -319,10 +315,6 @@ async def logout(credentials: HTTPAuthorizationCredentials = Depends(security)):
|
|
| 319 |
token = credentials.credentials
|
| 320 |
payload = auth_middleware.verify_token(token)
|
| 321 |
|
| 322 |
-
# Blacklist the token
|
| 323 |
-
expires_at = datetime.fromtimestamp(payload.get("exp", 0))
|
| 324 |
-
auth_middleware.blacklist_token(token, expires_at)
|
| 325 |
-
|
| 326 |
# Update session as ended
|
| 327 |
user_id = payload.get("sub")
|
| 328 |
if user_id:
|
|
|
|
| 287 |
new_access_token = auth_middleware.create_access_token(data={"sub": user.id})
|
| 288 |
new_refresh_token = auth_middleware.create_refresh_token(data={"sub": user.id})
|
| 289 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 290 |
# Create new session
|
| 291 |
await create_user_session(user.id, new_access_token, new_refresh_token, request)
|
| 292 |
|
|
|
|
| 315 |
token = credentials.credentials
|
| 316 |
payload = auth_middleware.verify_token(token)
|
| 317 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 318 |
# Update session as ended
|
| 319 |
user_id = payload.get("sub")
|
| 320 |
if user_id:
|
app/middleware/__init__.py
CHANGED
|
@@ -3,7 +3,6 @@ from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials
|
|
| 3 |
from jose import JWTError, jwt
|
| 4 |
from datetime import datetime, timedelta
|
| 5 |
from typing import Optional
|
| 6 |
-
import redis
|
| 7 |
from supabase import create_client, Client
|
| 8 |
|
| 9 |
from app.config.settings import settings
|
|
@@ -15,22 +14,10 @@ class AuthMiddleware:
|
|
| 15 |
|
| 16 |
def __init__(self):
|
| 17 |
self.security = HTTPBearer()
|
| 18 |
-
self.supabase
|
| 19 |
settings.SUPABASE_URL,
|
| 20 |
settings.SUPABASE_SERVICE_KEY
|
| 21 |
) if settings.SUPABASE_URL and settings.SUPABASE_SERVICE_KEY else None
|
| 22 |
-
|
| 23 |
-
# Redis client for token blacklisting
|
| 24 |
-
try:
|
| 25 |
-
self.redis_client = redis.Redis(
|
| 26 |
-
host=settings.REDIS_HOST,
|
| 27 |
-
port=settings.REDIS_PORT,
|
| 28 |
-
db=settings.REDIS_DB,
|
| 29 |
-
password=settings.REDIS_PASSWORD if settings.REDIS_PASSWORD else None,
|
| 30 |
-
decode_responses=True
|
| 31 |
-
)
|
| 32 |
-
except Exception:
|
| 33 |
-
self.redis_client = None
|
| 34 |
|
| 35 |
def create_access_token(self, data: dict, expires_delta: Optional[timedelta] = None) -> str:
|
| 36 |
"""Create JWT access token."""
|
|
@@ -59,14 +46,6 @@ class AuthMiddleware:
|
|
| 59 |
def verify_token(self, token: str) -> dict:
|
| 60 |
"""Verify JWT token."""
|
| 61 |
try:
|
| 62 |
-
# Check if token is blacklisted
|
| 63 |
-
if self.redis_client and self.redis_client.get(f"blacklist:{token}"):
|
| 64 |
-
raise HTTPException(
|
| 65 |
-
status_code=status.HTTP_401_UNAUTHORIZED,
|
| 66 |
-
detail="Token has been revoked",
|
| 67 |
-
headers={"WWW-Authenticate": "Bearer"},
|
| 68 |
-
)
|
| 69 |
-
|
| 70 |
payload = jwt.decode(token, settings.JWT_SECRET_KEY, algorithms=[settings.JWT_ALGORITHM])
|
| 71 |
return payload
|
| 72 |
except JWTError:
|
|
@@ -76,17 +55,6 @@ class AuthMiddleware:
|
|
| 76 |
headers={"WWW-Authenticate": "Bearer"},
|
| 77 |
)
|
| 78 |
|
| 79 |
-
def blacklist_token(self, token: str, expires_at: datetime):
|
| 80 |
-
"""Add token to blacklist."""
|
| 81 |
-
if self.redis_client:
|
| 82 |
-
try:
|
| 83 |
-
# Calculate TTL until token expires
|
| 84 |
-
ttl = int((expires_at - datetime.utcnow()).total_seconds())
|
| 85 |
-
if ttl > 0:
|
| 86 |
-
self.redis_client.setex(f"blacklist:{token}", ttl, "1")
|
| 87 |
-
except Exception:
|
| 88 |
-
pass # If Redis is down, continue without blacklisting
|
| 89 |
-
|
| 90 |
async def get_user_from_supabase(self, user_id: str) -> Optional[User]:
|
| 91 |
"""Get user from Supabase."""
|
| 92 |
if not self.supabase:
|
|
@@ -106,7 +74,7 @@ class AuthMiddleware:
|
|
| 106 |
token = credentials.credentials
|
| 107 |
payload = self.verify_token(token)
|
| 108 |
|
| 109 |
-
user_id
|
| 110 |
if user_id is None:
|
| 111 |
raise HTTPException(
|
| 112 |
status_code=status.HTTP_401_UNAUTHORIZED,
|
|
|
|
| 3 |
from jose import JWTError, jwt
|
| 4 |
from datetime import datetime, timedelta
|
| 5 |
from typing import Optional
|
|
|
|
| 6 |
from supabase import create_client, Client
|
| 7 |
|
| 8 |
from app.config.settings import settings
|
|
|
|
| 14 |
|
| 15 |
def __init__(self):
|
| 16 |
self.security = HTTPBearer()
|
| 17 |
+
self.supabase = create_client(
|
| 18 |
settings.SUPABASE_URL,
|
| 19 |
settings.SUPABASE_SERVICE_KEY
|
| 20 |
) if settings.SUPABASE_URL and settings.SUPABASE_SERVICE_KEY else None
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 21 |
|
| 22 |
def create_access_token(self, data: dict, expires_delta: Optional[timedelta] = None) -> str:
|
| 23 |
"""Create JWT access token."""
|
|
|
|
| 46 |
def verify_token(self, token: str) -> dict:
|
| 47 |
"""Verify JWT token."""
|
| 48 |
try:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 49 |
payload = jwt.decode(token, settings.JWT_SECRET_KEY, algorithms=[settings.JWT_ALGORITHM])
|
| 50 |
return payload
|
| 51 |
except JWTError:
|
|
|
|
| 55 |
headers={"WWW-Authenticate": "Bearer"},
|
| 56 |
)
|
| 57 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 58 |
async def get_user_from_supabase(self, user_id: str) -> Optional[User]:
|
| 59 |
"""Get user from Supabase."""
|
| 60 |
if not self.supabase:
|
|
|
|
| 74 |
token = credentials.credentials
|
| 75 |
payload = self.verify_token(token)
|
| 76 |
|
| 77 |
+
user_id = payload.get("sub")
|
| 78 |
if user_id is None:
|
| 79 |
raise HTTPException(
|
| 80 |
status_code=status.HTTP_401_UNAUTHORIZED,
|