Django JWT аутентификация TokenObtainPairView проблема
Я пытаюсь использовать 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 в вашей функции, пожалуйста, помогите.
Вы хотите добавить имя пользователя в полезную нагрузку JWT-токена? Или хотите найти имя пользователя через JWT-токен?
Если вы хотите изменить требования к маркеру, вам следует настроить TokenObtainPairSerializer
.
my_app/serializers.py
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
settings.py
...
SIMPLE_JWT = {
"TOKEN_OBTAIN_SERIALIZER": "my_app.serializers.MyTokenObtainPairSerializer",
}
...
Если вы хотите изменить способ подачи токенов (возможно, вы захотите использовать cookies), вам следует настроить TokenObtainPairView
или TokenRefreshView
.
my_app/views.py
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
urls.py
from my_app.views import CustomTokenObtainPairView
urlpatterns = [
...
path('api/token/', CustomTokenObtainPairView.as_view(), name='token_obtain_pair'),
...
]