Как добавить пользовательское утверждение в django rest_framework_simple_jwt?
В их официальной документации показана реализация только для представлений на основе классов.
Как сделать это для функции, т.е. Refreshtoken.for_user()?
from rest_framework_simplejwt.tokens import RefreshToken
def get_tokens_for_user(user):
refresh = RefreshToken.for_user(user)
return {
'refresh': str(refresh),
'access': str(refresh.access_token),
}
Отрывок отсюда. Здесь только показано, как создать токен вручную.
Я знаю, что использование pyjwt упростило бы жизнь, но для черного списка будет другой обходной путь.
Самый простой способ, которому я всегда следовал, приведен здесь. Вы можете увидеть, что класс Token в rest_framework_simplejwt реализован __setitem__ и __getitem__. Поэтому вы легко можете добавить утверждение к своему токену.
Вам необходимо создать клиентский сериализатор, который будет расширять класс TokenObtainSerializer. Смотрите код для лучшего понимания:
serializers.py:
class MyTokenObtainPairSerializer(TokenObtainSerializer):
token_class = RefreshToken
def validate(self, attrs):
data = super().validate(attrs)
refresh = self.get_token(self.user)
refresh["my_claim"] = "value" # here you can add custom cliam
data["refresh"] = str(refresh)
data["access"] = str(refresh.access_token)
return data
Затем создайте представление, которое будет расширять класс TokenViewBase:
views.py
class MyTokenObtainPairView(TokenViewBase):
serializer_class = MyTokenObtainPairSerializer
urls.py
urlpatterns = [
path('api/token/', MyTokenObtainPairView.as_view(), name='token_obtain_pair'),
]
Вот так, готово.
После выполнения этих шагов и расшифровки маркера доступа вы найдете что-то похожее на следующее:
{
"token_type": "access",
"exp": 1651785191,
"iat": 1651784891,
"jti": "8432cb561ef0467e909e4a4c05234b71",
"user_id": 1,
"my_claim": "value"
}
Для получения дополнительной информации вы можете посмотреть это repo. Здесь я сделал проект, следуя пакету rest_framework_simplejwt для изучения и понимания пользовательского бэкенда аутентификации.