У меня возникли проблемы с реализацией проверки аутентификации на сервере GraphQL, построенном с помощью FastAPI. Раньше мы использовали REST, но теперь мы переходим на GraphQL, и мне интересно, как я могу это реализовать. Раньше у нас были разные маршрутизаторы, и с FastAPI легко проверить аутентификацию на основе маршрутов с использованием зависимостей, как в здесь . Мы отправляем токен в заголовке авторизации, который мы декодируем в бэкэнде, и получаем обратно user_id, который мы затем можем использовать в наших различных конечных точках.
Мне интересно, как это может работать с использованием GraphQL здесь. Мы используем Graphene , и я просмотрел Примеры аутентификации Starlettes , а также вводную часть настройки GraphQl
import binascii
from fastapi import FastAPI
from starlette.authentication import (
AuthenticationBackend, AuthenticationError, SimpleUser, AuthCredentials
)
from starlette.graphql import GraphQLApp
from starlette.middleware import Middleware
from starlette.middleware.authentication import AuthenticationMiddleware
from schemas.root import my_schema
class BasicAuthBackend(AuthenticationBackend):
async def authenticate(self, request):
if "Authorization" not in request.headers:
raise AuthenticationError('No auth credentials')
auth = request.headers["Authorization"]
try:
id_token = auth.split('Bearer ')[1]
decoded_token = auth.verify_id_token(id_token)
except (ValueError, UnicodeDecodeError, binascii.Error) as exc:
raise AuthenticationError('Invalid basic auth credentials')
user_id = decoded_token['uid']
return AuthCredentials(["authenticated"]), user_id
middleware = [
Middleware(AuthenticationMiddleware, backend=BasicAuthBackend())
]
my_schema = Schema(
query=RootQuery,
mutation=RootMutation,
)
api = FastAPI(title=f"MyGraphQLServer", middleware=middleware)
api.add_route("/graphql", GraphQLApp(schema=my_schema))
для Например, представьте, что теперь я хочу аутентифицировать только запросы на мутацию, но не запросы запросов. Кроме того, я хочу получить доступ к user_id в каждом из моих преобразователей. Как лучше всего это сделать?