Кто-нибудь работал с Django REST Framework Simple-JWT?

Walk_Scythe

Новорег

Walk_Scythe

Новорег
Статус
Offline
Регистрация
28 Сен 2023
Сообщения
3
Лайки
0
Начал недавно заниматься Front-End для своего диплома и соответственно заинтерисовлся Django REST Framework и его библиотекой Simple-JWT, но очень тяжело далась эта тема. Может кто поделится опытом работы с ней и как лучше ее использовать?
 

ChatGPT

Искусственный интеллект
Модератор

ChatGPT

Искусственный интеллект
Модератор
Статус
Offline
Регистрация
18 Апр 2023
Сообщения
51
Лайки
41
Django REST Framework (DRF) — это мощный инструмент для создания веб-API в вашем Django-приложении, а библиотека Simple JWT предназначена для упрощения работы с аутентификацией на основе JSON Web Tokens (JWT). Вот несколько советов и шагов, которые могут помочь вам лучше разобраться и начать использовать Simple JWT в вашем проекте:

1. Установите необходимые пакеты:
Установите Django REST Framework и Simple JWT, если они ещё не установлены.

Код:
bash
   pip install djangorestframework
   pip install djangorestframework-simplejwt

2. Настройте настройки Django:
В вашем файле settings.py добавьте DRF и Simple JWT в INSTALLED_APPS, если они ещё там не добавлены, и настройте аутентификацию:

Код:
python
   INSTALLED_APPS = [
       # остальные ваши приложения
       'rest_framework',
   ]

   REST_FRAMEWORK = {
       'DEFAULT_AUTHENTICATION_CLASSES': (
           'rest_framework_simplejwt.authentication.JWTAuthentication',
       ),
   }

3. Настройте URL для токенов:
Создайте маршруты для получения и обновления токенов в вашем urls.py:

Код:
python
   from django.urls import path
   from rest_framework_simplejwt.views import (
       TokenObtainPairView,
       TokenRefreshView,
   )

   urlpatterns = [
       # другие ваши маршруты
       path('api/token/', TokenObtainPairView.as_view(), name='token_obtain_pair'),
       path('api/token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),
   ]

TokenObtainPairView используется для получения access и refresh токенов, а TokenRefreshView — для обновления access токена с использованием refresh токена.

4. Используйте токены в ваших запросах:
Когда вы получите токен через эндпоинт /api/token/, используйте его в заголовке Authorization в формате Bearer <token> для доступа к защищённым ресурсам.

5. Создание защищённого API:
Для того чтобы ограничить доступ к вашему API только для аутентифицированных пользователей, вы можете использовать DRF декораторы или mixin-классы. Пример использования декоратора:

Код:
python
   from rest_framework.decorators import api_view, permission_classes
   from rest_framework.permissions import IsAuthenticated
   from rest_framework.response import Response

   @api_view(['GET'])
   @permission_classes([IsAuthenticated])
   def my_protected_view(request):
       return Response({"message": "This is a protected view"})

6. Понимание JWT и безопасности:
Важно понимать, что JWT по своей природе обезопасен лишь на определенном уровне. Не храните чувствительные данные в самом токене. Также рекомендуется использовать HTTPS для повышения безопасности передачи токена.

7. Дополнительное чтение и примеры:
Ознакомьтесь с документацией Для просмотра ссылки Войди или Зарегистрируйся и Для просмотра ссылки Войди или Зарегистрируйся для более глубокого понимания и изучения примеров.

Эти шаги и советы помогут вам начать работать с Django REST Framework и Simple JWT. Если у вас возникнут конкретные проблемы или вопросы, не стесняйтесь обращаться за помощью на форумах или платформах, таких как Stack Overflow.
 

rumil13

Новорег

rumil13

Новорег
Статус
Offline
Регистрация
22 Фев 2025
Сообщения
3
Лайки
1
Чувак, тема с JWT и Django REST Framework (DRF) сначала кажется жесткой, но когда врубаешься — всё становится на места. Сам через это прошел, лови выжимку личного опыта без воды:


Зачем Simple-JWT?

  • Это надстройка над DRF для аутентификации через JWT-токены (как те ключи-карты в фитнесе, только для API).
  • JWT — это не куки: токен хранится у клиента (например, в localStorage браузера) и при каждом запросе летит в заголовке.
  • Проще сессий: не нужно хранить состояние на сервере. Особенно кайфово для мобилок и SPA (типа твоего React-фронта).

Как вьехать (по шагам):

1. Ставим пакеты:

bash
Copy
pip install djangorestframework-simplejwt
2. В settings.py добавляем настройки:

python
Copy
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_simplejwt.authentication.JWTAuthentication', # ключевая строка
),
}

# Настройки срока жизни токенов (можно кастомить)
from datetime import timedelta
SIMPLE_JWT = {
'ACCESS_TOKEN_LIFETIME': timedelta(minutes=30), # доступ короткий
'REFRESH_TOKEN_LIFETIME': timedelta(days=7), # обновление долгое
}
3. В urls.py проекта добавляем эндпоинты для работы с токенами:

python
Copy
from rest_framework_simplejwt.views import (
TokenObtainPairView,
TokenRefreshView,
)

urlpatterns = [
...
path('api/token/', TokenObtainPairView.as_view(), name='token_obtain_pair'), # получаем токен по логину/паролю
path('api/token/refresh/', TokenRefreshView.as_view(), name='token_refresh'), # обновляем access-токен
]

Как это работает на практике:

  1. Фронт шлет логин/пароль на /api/token/ → в ответе получает:
    json
    Copy
    {
    "refresh": "aaaaa.bbbbb.ccccc",
    "access": "xxxxx.yyyyy.zzzzz"
    }
    • access — токен для доступа к защищенным API (живет недолго).
    • refresh — токен для обновления access (живет долго).
  2. При каждом запросе к бэку фронт добавляет в заголовок:
    http
    Copy
    Authorization: Bearer xxxxx.yyyyy.zzzzz
  3. Когда access протух → фронт шлет refresh на /api/token/refresh/ → получает новый access.

Лайфхаки:

  • Кастомизация токенов (добавить данные юзера в токен):
    Создай файл serializers.py в своем приложении:
    python
    Copy
    from rest_framework_simplejwt.serializers import TokenObtainPairSerializer

    class MyTokenObtainPairSerializer(TokenObtainPairSerializer):
    @classmethod
    def get_token(cls, user):
    token = super().get_token(user)
    token['username'] = user.username # добавляем свои поля
    token['is_admin'] = user.is_staff
    return token

    # В urls.py подмени вьюху:
    from .serializers import MyTokenObtainPairSerializer
    from rest_framework_simplejwt.views import TokenObtainPairView

    class MyTokenObtainPairView(TokenObtainPairView):
    serializer_class = MyTokenObtainPairSerializer

    # И используй эту вьюху в урлах вместо стандартной.
  • Защита эндпоинтов:
    На любом DRF-вьюхе (или ViewSet) добавь пермишены:
    python
    Copy
    from rest_framework.permissions import IsAuthenticated

    class SecretDataView(APIView):
    permission_classes = [IsAuthenticated] # только для авторизованных
  • Тестирование через Postman:
    • Шли POST на /api/token/ с username и password в body → получи токен.
    • Далее делай запросы к защищенным урлам, добавляя заголовок Authorization: Bearer <access_token>.

Где чаще всего ловлю косяки:

  1. CORS — если фронт на другом порту, Django будет блокировать запросы. Решение:
    • Поставь django-cors-headers → настрой CORS_ALLOWED_ORIGINS в settings.py.
  2. Не обновляется access-токен — фронт должен отслеживать 401 ошибку и автоматически шлять refresh.
  3. Токен не попадает в заголовок — проверь, что фронт правильно его вставляет (лучше через axios-интерцепторы или fetch).

Пример с фронтом (React):

javascript
Copy
// Логин
const login = async (username, password) => {
const response = await fetch('/api/token/', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ username, password }),
});
const data = await response.json();
localStorage.setItem('access_token', data.access);
localStorage.setItem('refresh_token', data.refresh);
};

// Запрос к защищенному API
const fetchData = async () => {
const token = localStorage.getItem('access_token');
const response = await fetch('/api/secret/', {
headers: {
'Authorization': Bearer ${token},
},
});
if (response.status === 401) {
// Токен умер, пробуем обновить через refresh
// ... тут код для refresh
}
return response.json();
};

Полезные ссылки:

P.S. Если уперся в конкретную ошибку — пиши, разберемся. Первые пару дней чувствуешь себя обезьяной с гранатой, потом привыкаешь
 

arbuz3r

Местный
Местный

arbuz3r

Местный
Местный
Статус
Offline
Регистрация
13 Дек 2021
Сообщения
151
Лайки
115
Не понятна суть вопроса. Есть описанная общепринятая спецификация. Все этапы делаешь по ней, а эта либа всего лишь инструмент, чтобы поменьше бойлерплейт кода было
 
Сверху