Я пытаюсь использовать CustomTokenObtainPairView, чтобы получить свое имя пользователя в токене.
if user.check_password(password):
# refresh = RefreshToken.for_user(user)
# refresh.access_token['username'] = user.username
# token = str(refresh.access_token)
request.data = {
'username': username,
'password': password
}
token_response = CustomTokenObtainPairView.post(request=request.data)
response = Response()
response.set_cookie(key='jwt', value=token_response.data['access'], httponly=True,
secure=True)
response.data = {
'access': token_response.data['access']
}
return response
else:
return Response({'message': 'Wrong password!'}, status=400)
Я попытался сгенерировать токен и добавить в него имя пользователя, но это не сработало. Если кто-нибудь знает, как правильно использовать TokenObtainPairView в вашей функции, пожалуйста, помогите.
CustomTokenObtainPairSerializer — это модифицированный TokenObtainPairView, который позволяет мне генерировать токен JWT с полем имени пользователя. Библиотека djangorestframework-simplejwt.
Можете ли вы предоставить код, который вы использовали для этого?
'из rest_framework_simplejwt.serializers импортировать класс TokenObtainPairSerializer CustomTokenObtainPairSerializer(TokenObtainPairSerializer): @classmethod def get_token(cls, user): token = super().get_token(user) token['username'] = user.username return token'
Можете ли вы отредактировать свой вопрос и вставить в него код?
«Я пытался сгенерировать токен и добавить в него имя пользователя, но это не сработало». Вы можете быть более конкретным? Что пошло не так? Если есть ошибка, то какая?
Хотите добавить имя пользователя в полезную нагрузку токена JWT? или хотите найти имя пользователя через токен JWT?
да, я хочу добавить имя пользователя в свой токен. Но когда я генерирую токен с помощью функции RefreshToken.for_user(user). Его нельзя настроить, поэтому я предполагаю, что это можно сделать с помощью TokenObtainPairView, но я не понимаю, как вызвать этот метод в функции входа в систему или как он работает, поэтому я задал вопрос.
TokenObtainPairSerializer
.from rest_framework_simplejwt.serializers import TokenObtainPairSerializer
from rest_framework_simplejwt.tokens import Token
class CustomTokenObtainPairSerializer(TokenObtainPairSerializer):
@classmethod
def get_token(cls, user) -> Token:
token = super().get_token(user=user)
token["username"] = user.username
return token
...
SIMPLE_JWT = {
"TOKEN_OBTAIN_SERIALIZER": "my_app.serializers.MyTokenObtainPairSerializer",
}
...
TokenObtainPairView
или TokenRefreshView
.from rest_framework import status
from rest_framework.request import Request
from rest_framework.response import Response
from rest_framework_simplejwt.exceptions import TokenError, InvalidToken
from rest_framework_simplejwt.views import TokenObtainPairView
class CustomTokenObtainPairView(TokenObtainPairView):
def post(self, request: Request, *args, **kwargs) -> Response:
serializer = self.get_serializer(data=request.data)
try:
serializer.is_valid(raise_exception=True)
except TokenError as e:
raise InvalidToken(e.args[0])
response = Response(data=None, status=status.HTTP_200_OK)
response.set_cookie(key = "access", value=serializer.validated_data["access"], httponly=True, secure=True)
response.set_cookie(key = "refresh", value=serializer.validated_data["refresh"], httponly=True, secure=True)
return response
from my_app.views import CustomTokenObtainPairView
urlpatterns = [
...
path('api/token/', CustomTokenObtainPairView.as_view(), name='token_obtain_pair'),
...
]
TokenRefreshView
.
Я вижу, ты называешь вид
CustomTokenObtainPairView.post(request=request.data)
. Это представление, которое вы определили? Если да, можете ли вы дать его определение? Если это часть библиотеки, то какой библиотеки?