[0630] JWT - 로그인 및 로그아웃

nikevapormax·2022년 6월 30일
0

TIL

목록 보기
62/116
post-custom-banner

유화제작 프로젝트

JWT 토큰을 활용한 로그인

  • 이번 프로젝트에서는 django의 기본 session을 활용하는 것이 아닌, JWT 토큰을 활용하기로 하였다.
  • 따라서 이에 맞게 로그인을 변경해 보았다.
  • 먼저 우리가 이미 작성해 놓았던 django session을 사용한 로그인 및 로그아웃 view를 전부 삭제해 주었다.
  • user/urls.py
urlpatterns = [
    path('', views.UserView.as_view()),
   
    # simplejwt 에서 제공하는 기본 JWT 인증 
    path('api/token/', TokenObtainPairView.as_view(), name='token_obtain_pair'),
    path('api/token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),

    path('api/season/token/', SeasonTokenObtainPairView.as_view(), name='season_token'),
    path('api/authonly/', views.OnlyAuthenticatedUserView.as_view()),
]
  • api/token/을 타고 들어가면 payload에 user의 정말 기본적인 정보인 id 값만 들어가게 된다.
  • 반면 api/season/token/을 타고 들어가게 되면 내가 커스텀한 user의 추가 정보들을 불러올 수 있게 된다. 해당 커스텀은 아래와 같이 진행하였고, 그 아래에 있는 SeasonTokenObtainPairView를 통해 시리얼라이저를 사용할 수 있어 커스텀된 user의 정보를 얻을 수 있게 된다.
from rest_framework_simplejwt.serializers import TokenObtainPairSerializer

# TokenObtain == Access Token 으로 생각하면 됨! 
# 즉, 이곳에서 claim에 어떤 정보를 담고 싶은지에 대한 커스터마이징을 진행하면 됨!
class SeasonTokenObtainPairSerializer(TokenObtainPairSerializer):
    @classmethod
    # database에서 조회된 user의 정보가 user로 들어오게 된다. (요청한 user의 정보)
    def get_token(cls, user):
		# 가지고 온 user의 정보를 바탕으로 token을 생성한다.
        token = super().get_token(user)

        # 로그인한 사용자의 클레임 설정하기.
        token['id'] = user.id
        token['username'] = user.username
        token['email'] = user.email

        return token
class SeasonTokenObtainPairView(TokenObtainPairView):
    # serializer_class에 커스터마이징된 시리얼라이저를 넣어 준다.
    serializer_class = SeasonTokenObtainPairSerializer
  • 만약 access 토큰의 인증 시간이 만료되었다면, api/token/refresh/로 타고 들어가 만료된 토큰을 갱신할 수 있다. 로그인을 다시 하지 않고도 access 토큰을 얻을 수 있게 된다.
  • api/authonly/를 타고 들어가면 인증된 사용자만이 사용할 수 있는 회원정보 조회를 사용할 수 있다.
class OnlyAuthenticatedUserView(APIView):
    permission_classes = [permissions.IsAuthenticated]
    authentication_classes = [JWTAuthentication] 
    
    # 인가된 사용자의 정보 조회 
    def get(self, request):
        user = request.user
        
        if not user:
            return Response({"error": "접근 권한이 없습니다."}, status=status.HTTP_401_UNAUTHORIZED)
        
        serialized_user = UserSerializer(user)
        return Response({"user_info": serialized_user.data}, status=status.HTTP_200_OK)

JWT 토큰을 활용한 로그아웃

  • 해당 부분은 프론트앤드 쪽에서 refresh token을 삭제함으로써 이루어지게 된다. 따라서 현 시점에서는 진행하지 않았다.
profile
https://github.com/nikevapormax
post-custom-banner

0개의 댓글