Авторизация и аутентификация пользователей по JWT токенам - NurOrNuLL/ESDP-AP-5-6-TEAM-2 GitHub Wiki

Авторизация и аутентификация пользователей по JWT-токенам

JWT — как безопасный способ аутентификации и передачи данных. JSON Web Token (JWT) — это открытый стандарт (RFC 7519) для создания токенов доступа, основанный на формате JSON. Как правило, используется для передачи данных для аутентификации в клиент-серверных приложениях. Токены создаются сервером, подписываются секретным ключом и передаются клиенту, который в дальнейшем использует данный токен для подтверждения своей личности.

  • Источник статьи ссылка

  • Видео урок подключения JWT ссылка

  • Официальная страница JWT ссылка

  • После того, как посетитель прошел авторизацию в нашей системе, указав свой логин и пароль, система выдает ему 2 токена: access token и refresh токен.

  • После чего посетитель, когда хочет получить с сервера данные, например, свой профиль, вместе с запросом он передает Access токен. Сервер, получив его проверяет, что он действительный, вычитывает полезные данные из него (тот же user_id) и, таким образом, может идентифицировать пользователя.

  • Токен разделен на три основные группы: заголовок, полезные данные и сигнатура, разделенные между собой точкой.

  • Декодировать токен можно по ссылке для подробной информации

Установка библиотеки и подключение к проекту

pip install djangorestframework-simplejwt
  • далее в проекте django в файле settings.py в
INSTALLED_APPS = [
    ...
    'rest_framework_simplejwt',
    ...
]
REST_FRAMEWORK = {
    ...
    'DEFAULT_AUTHENTICATION_CLASSES': (
        ...
        'rest_framework_simplejwt.authentication.JWTAuthentication',
    )
    ...
} 
from datetime import timedelta
...

SIMPLE_JWT = {
    'ACCESS_TOKEN_LIFETIME': timedelta(minutes=5), # access токен время можно настроить
    'REFRESH_TOKEN_LIFETIME': timedelta(days=1), # refresh токен время можно настроить
    'ROTATE_REFRESH_TOKENS': False,
    'BLACKLIST_AFTER_ROTATION': False,
    'UPDATE_LAST_LOGIN': False,

    'ALGORITHM': 'HS256',
    'SIGNING_KEY': SECRET_KEY, 
    'VERIFYING_KEY': None,
    'AUDIENCE': None,
    'ISSUER': None,
    'JWK_URL': None,
    'LEEWAY': 0,

    'AUTH_HEADER_TYPES': ('Bearer',), # здесь Bearer можно заменить например на Token
    'AUTH_HEADER_NAME': 'HTTP_AUTHORIZATION',
    'USER_ID_FIELD': 'id',
    'USER_ID_CLAIM': 'user_id',
    'USER_AUTHENTICATION_RULE': 'rest_framework_simplejwt.authentication.default_user_authentication_rule',

    'AUTH_TOKEN_CLASSES': ('rest_framework_simplejwt.tokens.AccessToken',),
    'TOKEN_TYPE_CLAIM': 'token_type',
    'TOKEN_USER_CLASS': 'rest_framework_simplejwt.models.TokenUser',

    'JTI_CLAIM': 'jti',

    'SLIDING_TOKEN_REFRESH_EXP_CLAIM': 'refresh_exp',
    'SLIDING_TOKEN_LIFETIME': timedelta(minutes=5),
    'SLIDING_TOKEN_REFRESH_LIFETIME': timedelta(days=1),
}

  • далее в проекте django в файле urls.py
from rest_framework_simplejwt.views import (
    TokenObtainPairView,
    TokenRefreshView,
    TokenVerifyView
)

urlpatterns = [
    ...
    path('api/token/', TokenObtainPairView.as_view(), name='token_obtain_pair'),
    path('api/token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),
    path('api/token/verify/', TokenVerifyView.as_view(), name='token_verify'),
    ...
]