Как сделать так, чтобы пользователь был аутентифицирован?
Извините, я не знаю, как изменить синтаксис в 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:
заголовки запроса :
принять:
*/*
Accept-Encoding:
gzip, deflate, br
Accept-Language:
ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7
авторизация:
JWT eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InVzZXIiLCJleHAiOjE2NzA1MzgwNzIsIm9yaWdJYXQiOjE2NzA1Mzc3NzJ9.eGl0oI2x7kYeuhRyryhUdcLyNgnvXuUSRsBJu6_iHFY
.Соединение:
keep-alive
Content-Length:
111
content-type:
application/json
Host:
127.0.0.1:8000
Origin:
http://localhost:3000
Referer:
http://localhost:3000/
сек-ч-уа:
"Not?A_Brand";v="8", "Chromium";v="108", "Google Chrome";v="108"
sec-ch-ua-mobile:
?0
sec-ch-ua-platform:
"Windows"
Sec-Fetch-Dest:
empty
Sec-Fetch-Mode:
cors
Sec-Fetch-Site:
кросс-сайт
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 не самый лучший и перестал поддерживаться.