У меня есть следующая настройка для регистрации пользователя и раздачи токена доступа и обновления, токен обновления установлен в файлах cookie, а access_token только что раздается в json < /p>
# login_views
class UserLoginAPIView(APIView):
class UserLoginInputSerializer(serializers.Serializer):
username_or_email = serializers.CharField(write_only=True)
password = serializers.CharField(write_only=True)
class UserLoginOutputSerializer(serializers.Serializer):
username = serializers.CharField(read_only=True)
user_email = serializers.EmailField(read_only=True)
full_name = serializers.CharField(read_only=True)
is_verified = serializers.BooleanField(read_only=True)
verification_required = serializers.BooleanField(read_only=True)
user_type = serializers.ListField(child=serializers.CharField(), read_only=True)
staff = serializers.BooleanField(read_only=True)
superuser = serializers.BooleanField(read_only=True)
access_token = serializers.CharField(read_only=True)
def post(self, request, *args, **kwargs):
input_serializer = self.UserLoginInputSerializer(data=request.data)
input_serializer.is_valid(raise_exception=True)
try:
login_details, refresh_token = user_login(
**input_serializer.validated_data
)
except DjangoValidationError as e:
return Response(
{
"success": False,
"message": e.message,
},
status=status.HTTP_401_UNAUTHORIZED,
)
except ValidationError as e:
return Response(
{
"success": False,
"message": e.detail[0],
},
status=status.HTTP_401_UNAUTHORIZED,
)
except Exception as e:
return Response(
{
"success": False,
"message": str(e),
},
status=status.HTTP_400_BAD_REQUEST,
)
output_serializer = self.UserLoginOutputSerializer(login_details)
response = Response(
{
"success": True,
"message": "User log in successful.",
"data": output_serializer.data,
},
status=status.HTTP_200_OK,
)
response.set_cookie(
"refresh_token",
refresh_token,
max_age=settings.REFRESH_COOKIE_MAX_AGE,
httponly=True,
samesite="none",
secure=False,
)
return response
def user_login(*, username_or_email: str, password: str) -> tuple:
"""
Verifies user's credentials & returns access token & refresh token.
"""
@dataclass(frozen=True)
class UserLoginDetails:
user_type: List[str]
username: str
user_email: str
full_name: str
is_verified: bool
access_token: str
staff: bool
superuser: bool
credential_type = identify_email_or_username(credential=username_or_email)
if credential_type == "email":
user = user_get_from_email(email=username_or_email.lower())
else:
user = user_get_from_username(username=username_or_email.lower())
if user is None:
logger.warning(f"User with the given credentials does not exist.")
raise ValidationError(detail=_("Invalid credentials."))
if not user.check_password(password):
logger.warning(f"User with the given credentials does not exist.")
raise ValidationError(detail=_("Invalid credentials."))
username = user.username
user_email = user.email
full_name = user.full_name
is_verified = user.is_verified
user_type = get_user_roles_by_user(user=user)
staff = user.is_staff
superuser = user.is_superuser
print(user_type)
token = RefreshToken.for_user(user)
access_token = str(token.access_token)
refresh_token = str(token)
user_login_details = UserLoginDetails(
user_type, username, user_email, full_name, is_verified, access_token, staff, superuser
)
return user_login_details, refresh_token
< /code>
И у меня есть следующие представления, чтобы повернуть токен доступа, когда он истекает < /p>
class RotateAccessTokenAPIView(APIView):
def post(self, request, *args, **kwargs):
try:
token = RefreshToken(request.COOKIES.get('refresh_token'))
new_access_token = str(token.access_token)
response = Response(
{
"success": True,
"message": "Access token refreshed successfully.",
"data": {
"access_token": new_access_token,
},
},
status=status.HTTP_200_OK,
)
return response
except TokenError as e:
return Response(
{
"success": False,
"message": "Invalid refresh token.",
},
status=status.HTTP_401_UNAUTHORIZED,
)
except Exception as e:
return Response(
{
"success": False,
"message": str(e),
},
status=status.HTTP_400_BAD_REQUEST,
)
но когда токен обновляется и новый токен доступа устанавливается в заголовке авторизации, а затем запрос отправляется на другие защищенные маршруты API, далее говорится:
У меня есть следующая настройка для регистрации пользователя и раздачи токена доступа и обновления, токен обновления установлен в файлах cookie, а access_token только что раздается в json < /p> [code]# login_views class UserLoginAPIView(APIView): class UserLoginInputSerializer(serializers.Serializer): username_or_email = serializers.CharField(write_only=True) password = serializers.CharField(write_only=True)
credential_type = identify_email_or_username(credential=username_or_email) if credential_type == "email": user = user_get_from_email(email=username_or_email.lower()) else: user = user_get_from_username(username=username_or_email.lower())
if user is None: logger.warning(f"User with the given credentials does not exist.") raise ValidationError(detail=_("Invalid credentials."))
if not user.check_password(password): logger.warning(f"User with the given credentials does not exist.") raise ValidationError(detail=_("Invalid credentials."))
return user_login_details, refresh_token < /code> И у меня есть следующие представления, чтобы повернуть токен доступа, когда он истекает < /p> class RotateAccessTokenAPIView(APIView): def post(self, request, *args, **kwargs): try: token = RefreshToken(request.COOKIES.get('refresh_token')) new_access_token = str(token.access_token) response = Response( { "success": True, "message": "Access token refreshed successfully.", "data": { "access_token": new_access_token, }, }, status=status.HTTP_200_OK, ) return response except TokenError as e: return Response( { "success": False, "message": "Invalid refresh token.", }, status=status.HTTP_401_UNAUTHORIZED, ) except Exception as e: return Response( { "success": False, "message": str(e), }, status=status.HTTP_400_BAD_REQUEST, ) [/code] но когда токен обновляется и новый токен доступа устанавливается в заголовке авторизации, а затем запрос отправляется на другие защищенные маршруты API, далее говорится: [code]{ "detail": "Token contained no recognizable user identification", "code": "token_not_valid" } [/code] Чего мне здесь не хватает?