내일배움캠프 - 220708 타임어택

Dongwoo Kim·2022년 7월 8일
0

스파르타 코딩클럽

내일배움캠프 AI 웹개발자양성과정 2회차

20220708 타임어택

0. 주제

미니 채용 관리 시스템 : 특정 채용 공고에 지원자가 지원하는 API 구현
https://teamsparta.notion.site/0708-15927058599e45d5a40741d0599ae809

1. 문제

1. 프로젝트에 jwt 인증을 사용해서 access token을 발급하도록 simple jwt 설정

ACCESS_TOKEN_LIFETIME은 50분, REFRESH_TOKEN_LIFETIME은 1일로 설정

# user/urls.py
...
from rest_framework_simplejwt.views import (
    TokenObtainPairView,
    TokenRefreshView,
)

# user/
urlpatterns = [
	...
    path('token/', TokenObtainPairView.as_view(), name='token_obtain_pair'),
    path('token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),
]
# settings.py
...

SIMPLE_JWT = {
		# Access 토큰 유효 시간 설정하기
    'ACCESS_TOKEN_LIFETIME': timedelta(minutes=50),
		# Refresh 토큰 유효 시간 설정하기
    'REFRESH_TOKEN_LIFETIME': timedelta(days=1),

    'ROTATE_REFRESH_TOKENS': False,
    'BLACKLIST_AFTER_ROTATION': False,
    'UPDATE_LAST_LOGIN': False,

    'ALGORITHM': 'HS256',
    'SIGNING_KEY': SECRET_KEY,
    'VERIFYING_KEY': None,
    'AUDIENCE': None,
    'ISSUER': None,
    'JWK_URL': None,
    'LEEWAY': 0,

    'AUTH_HEADER_TYPES': ('Bearer',),
    'AUTH_HEADER_NAME': 'HTTP_AUTHORIZATION',
    'USER_ID_FIELD': 'id',
    'USER_ID_CLAIM': 'user_id',
    'USER_AUTHENTICATION_RULE': 'rest_framework_simplejwt.authentication.default_user_authentication_rule',

    'AUTH_TOKEN_CLASSES': ('rest_framework_simplejwt.tokens.AccessToken',),
    'TOKEN_TYPE_CLAIM': 'token_type',
    'TOKEN_USER_CLASS': 'rest_framework_simplejwt.models.TokenUser',

    'JTI_CLAIM': 'jti',

    'SLIDING_TOKEN_REFRESH_EXP_CLAIM': 'refresh_exp',
    'SLIDING_TOKEN_LIFETIME': timedelta(minutes=5),
    'SLIDING_TOKEN_REFRESH_LIFETIME': timedelta(days=1),
}

2. 지원자가 어떤 채용공고에 지원했는지 저장할 수 있도록 모델을 추가해보세요.

# post/models.py
...

class JobApplication(models.Model):
    candidate = models.ForeignKey(User, verbose_name="지원자", on_delete=models.CASCADE)
    jobpost = models.ForeignKey(JobPost, verbose_name="채용 공고",on_delete=models.CASCADE)
    created_at = models.DateTimeField("지원일", auto_now_add=True)

    class Meta:
        db_table = 'job_applications'

3. 2번에서 만든 모델의 객체를 직렬화 하기 위한 Serializer 구현

# post/serializers.py
...

class JobApplicationSerializer(serializers.ModelSerializer):
    jobpost = JobPostSerializer(read_only=True)

    class Meta:
        model = JobApplication
        fields = ('id', 'candidate', 'jobpost', 'created_at')

4. 채용 공고에 지원하는 API 구현 (이력서는 이미 있어서 지원하면 저장되있는 이력서로 자동으로 지원된다고 가정)

  • 지원하는 유저정보는 별도로 받지 않고 발급받은 access token 으로 인증할 것
  • request 예시(Bearer Token)
# post/urls.py
...
from .views import ApplicationView

urlpatterns = [
	...
    path('apply', ApplicationView.as_view()),
]
# post/views.py
# 채용 지원 기능
class ApplicationView(APIView):

    # 채원 지원
    def post(self, request):
        print(request.data)
        job_post_id = request.data.get('job_post', "")
        user = request.user
        
        job_post = JobPost.objects.filter(id=job_post_id)

        if 0 < len(job_post):
            job_post = job_post.first()
        else:
            return Response({"error": "job_post가 존재하지 않습니다."}, status=status.HTTP_400_BAD_REQUEST)

        data = {
            'candidate': user.id
        }

        job_application_serializer = JobApplicationSerializer(data=data)

        if job_application_serializer.is_valid():
            job_application_serializer.save(jobpost=job_post)

            return Response({'message': '저장 완료!'}, status=status.HTTP_200_OK)

        return Response(job_application_serializer.errors, status=status.HTTP_400_BAD_REQUEST)

5. 유저타입이 “candidate”일 때만 인가되도록 BasePermission을 상속받아서 IsCandidateUser 구현 후에 4번 API에 permission class로 지정할 것

# permissions.py

from rest_framework.permissions import BasePermission

class IsCandidateUser(BasePermission):
    """
    UserType이 candidate인 유저만 가능
    """
    message = '지원자만 사용하실 수 있습니다.'
    
    def has_permission(self, request, view):
        try :
            user_type = request.user.user_type.user_type
        except:
            user_type = None
        
        return bool(request.user and user_type == "candidate" )
        # return False
# post/views.py

# 채용 지원 기능
class ApplicationView(APIView):
    permission_classes = [IsCandidateUser]
    
    authentication_classes = [JWTAuthentication]
    # 채원 지원
    def post(self, request):
    	...

2. Github

https://github.com/kimphysicsman/nbcamp-timeattack-220708

profile
kimphysicsman

0개의 댓글