98 lines
3.0 KiB
Python
98 lines
3.0 KiB
Python
import json
|
||
import jwt
|
||
from django.conf import settings
|
||
from django.http import JsonResponse
|
||
from django.views.decorators.csrf import csrf_exempt
|
||
from jwt import InvalidTokenError
|
||
|
||
from .auth import get_bearer_token, scopes_from_payload, validator
|
||
|
||
|
||
@csrf_exempt
|
||
def test_jwt(request):
|
||
"""Тестовый endpoint для проверки JWT токена с подписью."""
|
||
|
||
try:
|
||
token = get_bearer_token(request)
|
||
except InvalidTokenError as exc:
|
||
return JsonResponse({"status": "error", "error": str(exc)}, status=403)
|
||
|
||
response = {"token_length": len(token), "token_preview": f"{token[:32]}...{token[-32:]}"}
|
||
|
||
try:
|
||
audience = getattr(settings, "LOGTO_TEAMS_AUDIENCE", None)
|
||
payload = validator.decode(token, audience=audience)
|
||
response.update(
|
||
{
|
||
"status": "ok",
|
||
"header": jwt.get_unverified_header(token),
|
||
"payload": payload,
|
||
"user_id": payload.get("sub"),
|
||
"team_uuid": payload.get("team_uuid"),
|
||
"scopes": scopes_from_payload(payload),
|
||
}
|
||
)
|
||
return JsonResponse(response, json_dumps_params={"indent": 2})
|
||
except InvalidTokenError as exc:
|
||
response["status"] = "invalid"
|
||
response["error"] = str(exc)
|
||
return JsonResponse(response, status=403, json_dumps_params={"indent": 2})
|
||
|
||
|
||
# GraphQL Views - authentication handled by GRAPHENE MIDDLEWARE
|
||
|
||
from graphene_django.views import GraphQLView
|
||
|
||
from .graphql_middleware import (
|
||
M2MNoAuthMiddleware,
|
||
PublicNoAuthMiddleware,
|
||
TeamJWTMiddleware,
|
||
UserJWTMiddleware,
|
||
)
|
||
|
||
|
||
def _is_introspection_query(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
|
||
|
||
|
||
class PublicGraphQLView(GraphQLView):
|
||
"""GraphQL view for public operations (no authentication)."""
|
||
|
||
def __init__(self, *args, **kwargs):
|
||
kwargs['middleware'] = [PublicNoAuthMiddleware()]
|
||
super().__init__(*args, **kwargs)
|
||
|
||
|
||
class UserGraphQLView(GraphQLView):
|
||
"""GraphQL view for user-level operations (ID Token)."""
|
||
|
||
def __init__(self, *args, **kwargs):
|
||
kwargs['middleware'] = [UserJWTMiddleware()]
|
||
super().__init__(*args, **kwargs)
|
||
|
||
|
||
class TeamGraphQLView(GraphQLView):
|
||
"""GraphQL view for team-level operations (Access Token)."""
|
||
|
||
def __init__(self, *args, **kwargs):
|
||
kwargs['middleware'] = [TeamJWTMiddleware()]
|
||
super().__init__(*args, **kwargs)
|
||
|
||
|
||
class M2MGraphQLView(GraphQLView):
|
||
"""GraphQL view for M2M (machine-to-machine) operations.
|
||
No authentication required - used by internal services (Temporal, etc.)
|
||
"""
|
||
|
||
def __init__(self, *args, **kwargs):
|
||
kwargs['middleware'] = [M2MNoAuthMiddleware()]
|
||
super().__init__(*args, **kwargs)
|