Initial commit from monorepo
This commit is contained in:
63
orders_app/middleware.py
Normal file
63
orders_app/middleware.py
Normal file
@@ -0,0 +1,63 @@
|
||||
import json
|
||||
import logging
|
||||
|
||||
from django.conf import settings
|
||||
from django.utils.deprecation import MiddlewareMixin
|
||||
from jwt import InvalidTokenError
|
||||
|
||||
from .auth import get_bearer_token, scopes_from_payload, validator
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
class LogtoJWTMiddleware(MiddlewareMixin):
|
||||
"""
|
||||
JWT middleware для проверки токенов от Logto
|
||||
"""
|
||||
|
||||
def __init__(self, get_response=None):
|
||||
super().__init__(get_response)
|
||||
|
||||
# Audience validated only for non-introspection API calls
|
||||
self.audience = getattr(settings, "LOGTO_ORDERS_AUDIENCE", None)
|
||||
|
||||
def _is_introspection_query(self, request):
|
||||
"""Проверяет, является ли запрос introspection (для GraphQL codegen)"""
|
||||
if request.method != 'POST':
|
||||
return False
|
||||
try:
|
||||
body = json.loads(request.body.decode('utf-8'))
|
||||
query = body.get('query', '')
|
||||
return '__schema' in query or '__type' in query
|
||||
except Exception:
|
||||
return False
|
||||
|
||||
def process_request(self, request):
|
||||
"""Обрабатывает Team Access Token для Orders API"""
|
||||
|
||||
# Пропускаем проверку для admin панели и статики
|
||||
if request.path.startswith('/admin/') or request.path.startswith('/static/'):
|
||||
return None
|
||||
|
||||
# Пропускаем introspection запросы (для GraphQL codegen)
|
||||
if self._is_introspection_query(request):
|
||||
return None
|
||||
|
||||
try:
|
||||
token = get_bearer_token(request)
|
||||
payload = validator.decode(token, audience=self.audience)
|
||||
|
||||
# Проверяем scope
|
||||
scopes = scopes_from_payload(payload)
|
||||
if 'teams:member' not in scopes:
|
||||
return None
|
||||
|
||||
# Извлекаем данные пользователя и команды
|
||||
request.user_id = payload.get('sub')
|
||||
request.team_uuid = payload.get('team_uuid')
|
||||
request.scopes = scopes
|
||||
|
||||
except InvalidTokenError:
|
||||
# Любая ошибка = нет доступа (тихо)
|
||||
return None
|
||||
|
||||
return None
|
||||
Reference in New Issue
Block a user