[Python] Erro relacionado a remoção de Cookies HttpOnly

Discussão em 'Python' iniciado por Stack, Março 10, 2025.

  1. Stack

    Stack Membro Participativo

    Estou fazendo um sistema utilizando Django (back-end) e React (front). Meu problema está relacionado ao logout do usuário, pois os Cookies não estão sendo limpos no front-end, e assim ele continua sendo passado nas requisições mesmo após o logout. Aqui estão minhas views de autenticação:

    from django.http import JsonResponse
    from rest_framework.decorators import api_view
    from rest_framework.views import APIView
    from rest_framework.response import Response
    from rest_framework import status
    from rest_framework_simplejwt.tokens import AccessToken
    from rest_framework_simplejwt.views import TokenRefreshView
    from rest_framework_simplejwt.tokens import RefreshToken
    from rest_framework_simplejwt.exceptions import InvalidToken
    from rest_framework_simplejwt.token_blacklist.models import BlacklistedToken
    from django.contrib.auth import authenticate

    class LoginView(APIView):
    def post(self, request):
    email = request.data.get("email")
    password = request.data.get("password")

    user = authenticate(email=email, password=password)
    if user is None:
    return Response({"detail": "Invalid credentials"}, status=status.HTTP_401_UNAUTHORIZED)

    refresh = RefreshToken.for_user(user)
    access_token = str(refresh.access_token)

    response = Response({"detail": "Login successful"}, status=status.HTTP_200_OK)
    response.set_cookie(
    key="access_token",
    value=access_token,
    httponly=True,
    secure=True,
    samesite="None",
    path="/"
    )
    response.set_cookie(
    key="refresh_token",
    value=str(refresh),
    httponly=True,
    secure=True,
    samesite="None",
    path="/"
    )
    return response

    class LogoutView(APIView):
    def post(self, request):
    refresh_token = request.COOKIES.get("refresh_token")

    if refresh_token:
    try:
    refresh = RefreshToken(refresh_token)
    refresh.blacklist()
    except Exception as e:
    return Response({"error":"Error invalidating token:" + str(e) }, status=status.HTTP_400_BAD_REQUEST)

    response = Response({"message": "Successfully logged out!"}, status=status.HTTP_200_OK)

    try:
    response.delete_cookie(
    key="access_token",
    path="/"
    )
    response.delete_cookie(
    key="refresh_token",
    path="/"
    )
    response.data = {"message": "The cookie was removed"}
    except Exception as e:
    response.data = {"error": f"Remove cookie error: {str(e)}"}
    response.status_code = status.HTTP_400_BAD_REQUEST

    return response

    class CookieTokenRefreshView(TokenRefreshView):
    def post(self, request):

    refresh_token = request.COOKIES.get("refresh_token")

    if not refresh_token:
    return Response({"error":"Refresh token not provided"}, status= status.HTTP_401_UNAUTHORIZED)

    try:
    refresh = RefreshToken(refresh_token)
    access_token = str(refresh.access_token)

    response = Response({"message": "Access token token refreshed successfully"}, status=status.HTTP_200_OK)
    response.set_cookie(key="access_token",
    value=access_token,
    httponly=True,
    secure=True,
    samesite="None")
    return response
    except InvalidToken:
    return Response({"error":"Invalid token"}, status=status.HTTP_401_UNAUTHORIZED)


    class CheckIsAuth(APIView):
    def get(self, request):
    access_token = request.COOKIES.get("access_token")

    if not access_token:
    return Response({"message": "Access token were not provided"}, status=status.HTTP_401_UNAUTHORIZED)

    try:
    access = AccessToken(access_token)

    if BlacklistedToken.objects.filter(token__jti=access["jti"]).exists():
    return Response({"message": "Token is blacklisted"}, status=status.HTTP_401_UNAUTHORIZED)

    user = request.user

    if user.is_authenticated:
    return JsonResponse({"User": user.email}, status=status.HTTP_200_OK)
    else:
    return Response({"error": "User is not authenticated"}, status=status.HTTP_401_UNAUTHORIZED)

    except InvalidToken:
    return Response({"message": "Invalid token"}, status=status.HTTP_401_UNAUTHORIZED)


    Já verifiquei a aba Network do navegador e pude verificar que ao fazer o logout, os tokens "access_token" e "refresh_token" permanecem nos Cookies do navegador. E qual o problema nisso? Eu uso a view "CheckIsAuth" para verificar se o usuário está autenticado, e mesmo após o logout, o servidor retorna que o usuário está autenticado.

    O estranho é que se eu tento fazer outro logout, após ter feito o logout anteriormente, o servidor retorna que o token está na blacklist, e esse mesmo token no "CheckIsAuth" é válido.

    Preciso de ajuda para fazer com que após o login, os Cookies sejam removidos do navegador, ou então, que o access_token seja inválido, para que a view "CheckIsAuth" retorne um 401, indicando que o usuário não está autorizado.

    Continue reading...

Compartilhe esta Página