Как сделать так, чтобы пользователь был аутентифицирован?

Извините, я не знаю, как изменить синтаксис в stackowerflow и решил просто поместить ссылку на репозиторий для вас:
https://github.com/ilya-6370/todo-react

Папка backend/todo является основной папкой с settings,py и основным файлом scheme.py

Папка backemd/todoapp - это папка с деталями приложения и api для todos в scheme.py

папка frontend - это папка с react app, где я использую apolo client для выполнения запроса и добавления пользовательского заголовка

Когда я пытаюсь получить тодосы, я получаю ошибку разрешения:

{"errors":[{"message":"You do not have permission to perform this action","locations":[{"line":2,"column":3}],"path":["todos"]}],"data":{"todos":null}}

headers:

заголовки запроса :

  1. принять:

    */*

  2. Accept-Encoding:

    gzip, deflate, br

  3. Accept-Language:

    ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7

  4. авторизация:

    JWT eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InVzZXIiLCJleHAiOjE2NzA1MzgwNzIsIm9yaWdJYXQiOjE2NzA1Mzc3NzJ9.eGl0oI2x7kYeuhRyryhUdcLyNgnvXuUSRsBJu6_iHFY

    .
  5. Соединение:

    keep-alive

  6. Content-Length:

    111

  7. content-type:

    application/json

  8. Host:

    127.0.0.1:8000

  9. Origin:

    http://localhost:3000

  10. Referer:

    http://localhost:3000/

  11. сек-ч-уа:

    "Not?A_Brand";v="8", "Chromium";v="108", "Google Chrome";v="108"

  12. sec-ch-ua-mobile:

    ?0

  13. sec-ch-ua-platform:

    "Windows"

  14. Sec-Fetch-Dest:

    empty

  15. Sec-Fetch-Mode:

    cors

  16. Sec-Fetch-Site:

    кросс-сайт

  17. User-Agent:

    Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36

    >

У меня есть пользовательское поле "authorisation" с token. Как я могу сделать пользователя авторизованным для системы по jwt токену (я думаю это моя проблема, потому что я сделал требуемые поля для авторизации в моем файле scheme.py в папке todoapp. Я думаю, что токен не дает статус авторизованного, мне нужен способ сделать пользователя авторизованным по токену. )

Я попытался добавить

GRAPHQL_JWT = {
    'JWT_AUTH_HEADER_PREFIX': 'JWT',
}

в settings.py, но ничего не изменилось

Проклятье, это заняло больше времени, чем следовало :D. Я создаю свои бэкенды auth, поэтому я понятия не имел, как этот работает.

Я проверил, и вам нужно обновить ваш urls.py следующим образом:

from django.contrib import admin
from django.urls import path
from graphene_django.views import GraphQLView
from django.views.decorators.csrf import csrf_exempt
from graphql_jwt.decorators import jwt_cookie


urlpatterns = [
    path('admin/', admin.site.urls),
    path("graphql/", jwt_cookie(csrf_exempt(GraphQLView.as_view(graphiql=True)))),
]

Проблема, с которой вы столкнулись, заключается в том, что этот пакет берет токен из cookie, а не из { "Authorization" : "Bearer token" }

Просто оберните ваше представление с jwt_cookie, чтобы позволить нагрузке произойти под капотом, и пакет сам по себе решит эту проблему.

Я бы также посоветовал вам иначе структурировать вашу схему. Я обычно создаю dir(MyModel) для каждой модели/приложения-> dir(graphql) -> queries.py, mutations.py, types.py и т.д. и в конце schema.py, в котором я создаю Query/Mutation и передаю все в него.

На уровне проекта вы создаете schema.py и в нем импортируете схемы из вашего приложения и один последний класс Query/Mutation, который наследует app.schema.Query/Mutation, и вставляете его в schema = Schema(...)

Также я советую вам использовать Strawberry GraphQL + его родственников вместо Graphene. Graphene не самый лучший и перестал поддерживаться.

Вернуться на верх