Утверждения токенов 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",
...
}