web-dev-qa-db-ja.com

Django RESTフレームワーク認証でGrapheneGraphQLフレームワークを使用する方法

いくつかのREST APIエンドポイントをDjangoで取得し、グラフェンに 同じ認証 を使用したい。 ドキュメント はガイダンスを提供しません。

21
Ricardo Stuven

たとえば、APIビューでauthentication_classes = (TokenAuthentication,)を使用している場合、次のように装飾された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エンドポイントを追加し、GraphiQLツールで使用される元の^graphqlを保持していることに注意してください。

次に、GraphQLクライアントでAuthorizationヘッダーを設定し、graphql_tokenエンドポイントをポイントする必要があります。


更新: このGitHubの問題 を参照してください。ここでは、人々が代替ソリューションと完全な実例を提案しています。

22
Ricardo Stuven

この統合を実行するときに実行する必要があったいくつかの追加手順を追加します。

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はそれを読み取り、GraphQLViewに渡される前に.dataにアタッチします。

3
travisbloom