Утверждения токенов JWT в Django Rest Framework

Я использую rest_framework_simplejwt и хотел бы добавить дополнительную информацию к возвращаемому маркеру доступа для целей авторизации. Следуя примеру https://django-rest-framework-simplejwt.readthedocs.io/en/latest/customizing_token_claims.html, я могу изменить маркер доступа. Однако я хочу иметь возможность добавить утверждение, основанное на первоначальном POST-логине. Например:

curl -X POST -H 'Content-type: application/json' -d '{"username": "user1", "password": "supersecretpassword", "project": "project1"}' https://myurl.com/api/token/

Я хотел бы иметь возможность добавлять project1 к маркеру доступа. Есть ли способ добавить дополнительную информацию таким образом?

Добавлено поле проекта в TokenObtainSerializer.

В TokenObtainPairSerializer добавлен процесс добавления проектных значений в полезную нагрузку токена.

serializers.py

from django.contrib.auth.models import update_last_login
from rest_framework_simplejwt.tokens import RefreshToken
from rest_framework_simplejwt.settings import api_settings
from rest_framework_simplejwt.serializers import TokenObtainSerializer
from rest_framework import serializers


class CustomTokenObtainSerializer(TokenObtainSerializer):
  
  def __init__(self, *args, **kwargs) -> None:
    super().__init__(*args, **kwargs)
    self.fields["project"] = serializers.CharField()
    
class CustomTokenObtainPairSerializer(CustomTokenObtainSerializer):
  token_class = RefreshToken

  def validate(self, attrs):
      data = super().validate(attrs)
      refresh = self.get_token(self.user)
      refresh["project"] = attrs["project"]

      data["refresh"] = str(refresh)
      data["access"] = str(refresh.access_token)

      if api_settings.UPDATE_LAST_LOGIN:
          update_last_login(None, self.user)
      return data

Чтобы сделать вышеупомянутый класс Serializer доступным в TokenOptainPairView, я изменил значения настроек, связанные с settings.py SIMPLE_JWT.

settings.py

SIMPLE_JWT = {
  ...
  "TOKEN_OBTAIN_SERIALIZER": "yourapp.serializers.CustomTokenObtainPairSerializer",
  ...
}

enter image description here

enter image description here

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