37 lines
1.2 KiB
Python
37 lines
1.2 KiB
Python
"""Authentication decorators and middleware."""
|
|
|
|
from functools import wraps
|
|
from typing import Any, Callable
|
|
|
|
from flask import jsonify, request
|
|
|
|
from app.services.token_service import TokenService
|
|
|
|
|
|
def require_auth(f: Callable[..., Any]) -> Callable[..., Any]:
|
|
"""Decorator to require authentication for routes."""
|
|
@wraps(f)
|
|
def decorated_function(*args: Any, **kwargs: Any) -> Any:
|
|
token_service = TokenService()
|
|
access_token = request.cookies.get("access_token")
|
|
|
|
if not access_token:
|
|
return jsonify({"error": "Authentication required"}), 401
|
|
|
|
user_data = token_service.get_user_from_access_token(access_token)
|
|
if not user_data:
|
|
return jsonify({"error": "Invalid or expired token"}), 401
|
|
|
|
return f(*args, **kwargs)
|
|
return decorated_function
|
|
|
|
|
|
def get_current_user() -> dict[str, Any] | None:
|
|
"""Helper function to get current user from access token."""
|
|
token_service = TokenService()
|
|
access_token = request.cookies.get("access_token")
|
|
|
|
if not access_token:
|
|
return None
|
|
|
|
return token_service.get_user_from_access_token(access_token) |