Есть ли способ проанализировать AST из GraphQLString с помощью Graphene / GraphQL - PullRequest
0 голосов
/ 25 марта 2019

Я ищу написать промежуточное программное обеспечение для моей конечной точки GraphQL, используя PyJWT.Проблема в том, что я не хочу защищать свою мутацию при входе.Поэтому я пытаюсь написать промежуточное программное обеспечение, чтобы исключить мутацию при входе в систему.

Это было легко сделать, написав промежуточное программное обеспечение GraphQL, потому что аргументы, передаваемые в промежуточное программное обеспечение, дали мне возможность проверить имя запроса..

class JWTMiddleware(object):
    def resolve(self, next, root, info, **args):
        if info.field_name == 'login':
            return next(root, info, **args
        # rest of auth logic

Но так как GraphQL всегда возвращает 200, я не могу использовать код состояния для проверки подлинности на клиенте.И нужно будет проверить массив errors, чтобы увидеть, является ли сообщение Unauthorized или что-то в этом роде.

Пример ответа об ошибке:

{
    errors: [
        {
            message: 'Unauthorized: JWT invalid',
            ...,
        },
        ...
    ],
    data: null
}

Это нормально, но я бы предпочел использоватькод статуса ответа в качестве моей проверки, поэтому я решил обернуть представление GraphQL с помощью специального декоратора.

def jwt_required(fn):
    def wrapper(request):
        # no access to query name, just the GraphQLString
        # need function to parse the AST of a GraphQLString
        graphql_string = request.body.decode('utf-8')
        query_name = ast[0].name  # or something like this
        if query_name == 'login':
             return fn(request)
        # rest of auth logic
        return fn(request)
    return wrapper


def protected_graphql_view():
    return jwt_required(GraphQLView.as_view())


urlpatterns = [
    path('admin/', admin.site.urls),
    path('graphiql', GraphQLView.as_view(graphiql=True)),
    path('graphql', protected_graphql_view()),
    path('token/refresh', refresh_token_view),
]

Делая так, я теперь могу возвращать ответы с разными кодами состояния.Но опять-таки проблема в том, что я не могу легко проверить, является ли запрос на вход в систему, и пропустить логику аутентификации, если я не смогу правильно проанализировать GraphQLString.

Я бы предпочел не создавать что-то по заказу, если это возможно.Я бы предположил, что GraphQL или Graphene предоставят что-то вроде этого.

Пожалуйста, дайте мне знать, если мне нужно предоставить больше информации.Спасибо за любую помощь!

...