Рубрики
Без рубрики

Добавление разрешенного специфической аутентификации для API GraphQL

Аутентификация для API GraphQL путем ограничения функций Resolver. Помечено GraphQL, fastapi, python, аутентификация.

Я использую Ariadne Graphql как под приложение к приложению Fastapi, вы найдете весь код здесь https://github.com/zero-shubham/freiteup-graphql-api.

Как правило, с Restapi мы делаем конечные точки ограничения, но с API GraphQL у нас есть только одна конечная точка, на которую выполняются запросы. Теперь сделать эту единственную конечную точку (в этом случае это /Graphql ) Ограничено просто, но что, если вы не хотите, чтобы все, что вы хотите, чтобы конкретные резользеры (функции, которые возвращают ответы на запросы и мутации), чтобы быть ограничены? Постараюсь ответить на то, прежде чем это давайте сначала поймете текущую настройку нашего приложения.

Сейчас пытаясь ответить на наш вопрос, следующий логический шаг будет добавлять аутентификацию в нашем подпоне. Мы добавим токен JWT в Cookie Repeate Cookie, это будет защищенное httsPonly Secure Cookie. Для этого мы добавим Resolver входа в систему аналогичным коде, как следующее – https://pastebin.com/uqehtf1t Проверьте, существует ли такой пользователь, сопоставьте пароль, если пароль совпадает с аутентификацией пользователя, добавив токен в ответ в виде cookie. Это кажется сделанным и правдоподобным решением, но когда вы пытаетесь, чтобы он не сработал, и наше приложение GraphQL бросит ошибку, говорящую, что ответ не соответствует указанной схеме.

Наше приложение GraphQl ожидает, что словарь с ключами же, что и в определенной схеме, но когда мы возвращаем объект ответа вместо того, чтобы ключевые клавиши лота вернутся. Все заголовки и куки там присутствуют и добавляют их в схему, не имеет смысла. Итак, текущий сценарий кажется как –

Единственный способ добавить файл cookie в ответ, если он добавляется после ответа под приложение GraphQL, так технически добавляется токен в Cookie Action Cookie Fastapi. Для этого нам нужно сообщить это для Фастапи, но как? Определенно использование подразбов и декораторов (функции высшего порядка).

Поскольку мы используем ASGI Server в любой момент времени, когда экземпляр приложения может обрабатывать более одного запроса, мы должны учитывать, что при побуждении с решением. Лучшее решение, которое я могу придумать, это поддерживать словарь запросов и их соответствующий токен, который будет позже использован при отправке ответа.

Итак, чтобы визуализировать сценарий, теперь он должен соответствовать –

Если вы можете ссылаться на Application.py, я использовал разные подразнения, так что проблемы могут быть разделены. Как название предполагает cookie_set промежуточное программное обеспечение делает последние проверки ID запроса (UUID, назначенный каждому объекту запроса), есть ли какой-либо токен, если это так, добавляет его к ответу. Другое промежуточное программное обеспечение Basicauthbackend Проверяет каждый запрос на любой заголовок Cookie «Авторизация», который имеет токен, использует его для аутентификации запроса. Также добавьте идентификатор запроса на объект запроса и добавьте этот идентификатор запроса и токен в словарь, который поддерживает токены для каждого запроса. Теперь, если вы смущены, почему нам нужно поддерживать словарь для этого, ну, потому что мы должны использовать этот словарь в нескольких вызовах функции. Например, внутри «введите» Resolver, где внутри объекта запроса не будет токена, поэтому эта функция Resolver назначит токен к этому словарю, используя запрос я бы. Для эталонных задач Resolvers/user.py

Если вы посмотрите внимательно, я также использую декоратор здесь необходима аутентификация Это похоже на что-то вроде jwt_required, если вы знакомы с приложениями колб. Обратитесь к этому файлу Middemware.py, вы найдете эту функцию более высокого порядка. Итак, всякий раз, когда мы добавляем этот декоратор перед любой функцией Resolver, это вызывается, и если запрос не аутентифицирован, он вернется без вызова функции Resolver.

Именно это было, я не могу объяснить все это все. Итак, не стесняйтесь спрашивать ваши сомнения или даже какие-либо предложения, которые сделают всю эту установку проще, чем то, что она есть. Спасибо!

Оригинал: “https://dev.to/zero_shubham/adding-resolver-specific-auth-for-graphql-api-1262”