로그아웃을 호출하는 순간 클라이언트는 access 토큰을 삭제하고,
refresh 토큰을 데이터로 보낸다.
서버는 refresh 토큰을 블랙리스트에 저장시킨다.
from rest_framework_simplejwt.tokens import RefreshToken
class LogoutView(generics.CreateAPIView):
permission_classes = (IsAuthenticated,)
...
..
class LogoutSerializer(serializers.Serializer):
refresh_token = serializers.CharField(write_only=True)
message = serializers.CharField(read_only=True)
def __logout(self, request):
refresh_token = request.data["refresh_token"]
token = RefreshToken(refresh_token)
token.blacklist()
def validate(self, attrs):
attrs["user"] = self.context.get("request").user
return attrs
@transaction.atomic
def create(self, validated_data):
res = dict()
try:
with transaction.atomic():
self.__logout(self.context.get("request"))
res.update({"message": "로그아웃 되었습니다."})
return res
except Exception as e:
logger.error("error")
logger.error(e)
res.update({"message": "서버 에러"})
return res