Как использовать графическую структуру Graphene GraphQL с аутентификацией Django REST Framework

Я получил несколько конечных точек REST API в Django, и я хотел бы использовать ту же аутентификацию для Graphene. Документация не дает никаких указаний.

Ответы

Ответ 1

Например, если вы используете authentication_classes = (TokenAuthentication,) в своих представлениях API, вы можете добавить конечную точку в GraphQLView, оформленный следующим образом:

urls.py:

# ...
from rest_framework.authentication import TokenAuthentication
from rest_framework.permissions import IsAuthenticated
from rest_framework.decorators import authentication_classes, permission_classes, api_view

def graphql_token_view():
    view = GraphQLView.as_view(schema=schema)
    view = permission_classes((IsAuthenticated,))(view)
    view = authentication_classes((TokenAuthentication,))(view)
    view = api_view(['GET', 'POST'])(view)
    return view

urlpatterns = [
# ...
    url(r'^graphql_token', graphql_token_view()),
    url(r'^graphql', csrf_exempt(GraphQLView.as_view(schema=schema))),
    url(r'^graphiql', include('django_graphiql.urls')),
# ...

Обратите внимание, что мы добавили новую ^graphql_token точку ^graphql_token и сохранили исходную ^graphql которая используется инструментом GraphiQL.

Затем вы должны установить заголовок Authorization в вашем клиенте GraphQL и указать graphql_token точку graphql_token.


ОБНОВЛЕНИЕ: посмотрите эту проблему GitHub, где люди предложили альтернативные решения и полные рабочие примеры.

Ответ 2

Добавление некоторых дополнительных шагов, которые я должен был предпринять, следуя этой интеграции:

class RTGraphQLView(GraphQLView):

def parse_body(self, request):
    if type(request) is rest_framework.request.Request:
        return request.data
    return super().parse_body(request)

Графен ожидал .body attr, но DRF читает его и прикрепляет к .data перед тем, как передать его в GraphQLView.