Я ищу написать промежуточное программное обеспечение для моей конечной точки 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 предоставят что-то вроде этого.
Пожалуйста, дайте мне знать, если мне нужно предоставить больше информации.Спасибо за любую помощь!