33 lines
996 B
Python
33 lines
996 B
Python
"""
|
|
GraphQL middleware for JWT authentication.
|
|
"""
|
|
from graphql import GraphQLError
|
|
from jwt import InvalidTokenError
|
|
|
|
from .auth import get_bearer_token, validator
|
|
|
|
|
|
def _is_introspection(info) -> bool:
|
|
"""Возвращает True для любых introspection резолвов."""
|
|
field = getattr(info, "field_name", "")
|
|
parent = getattr(getattr(info, "parent_type", None), "name", "")
|
|
return field.startswith("__") or parent.startswith("__")
|
|
|
|
|
|
class UserJWTMiddleware:
|
|
"""User endpoint - requires ID token."""
|
|
|
|
def resolve(self, next, root, info, **kwargs):
|
|
request = info.context
|
|
if _is_introspection(info):
|
|
return next(root, info, **kwargs)
|
|
|
|
try:
|
|
token = get_bearer_token(request)
|
|
payload = validator.decode(token)
|
|
request.user_id = payload.get('sub')
|
|
except InvalidTokenError as exc:
|
|
raise GraphQLError("Unauthorized") from exc
|
|
|
|
return next(root, info, **kwargs)
|