Westagram


JWT


✓ JWT Decorator

  • Class Ver. utils.py部分
  • class LoginConfirm:
        def __init__(self, original_function):
            self.original_function = original_function
        
        def __call__(self, request, *args, **kwargs):
            token = request.headers.get("Authorization", None)
            try:
                if token:
                    token_payload = jwt.decode(token, SECRET, algorithms='HS256')
                    user          = User.objects.get(id=token_payload['user_id'])
                    request.user  = user
                    return self.original_function(self, request, *args, **kwargs)
    
                return JsonResponse({'MESSAGE': 'NEED_LOGIN'}, status=401)
    
            except jwt.ExpiredSignatureError:
                return JsonResponse({'MESSAGE': 'EXPIRED_TOKEN'}, status=401)
            
            except jwt.DecodeError:
                return JsonResponse({'MESSAGE': 'INVALID_USER_ERROR'}, status=401)
            
            except User.DoesNotExist:
                return JsonResponse({'MESSAGE': 'INVALID_USER_ERROR'}, status=401)
  • Def Ver. utils.py部分
  • def login_confirm(original_function):
    
        def wrapper(self, request):
            try:
                token = request.headers.get("Authorization", None)
                if token:
                    token_payload = jwt.decode(token, SECRET, algorithms='HS256')
                    user          = User.objects.get(id=token_payload['user_id'])
                    request.user  = user
                    return original_function(self, request)
    
                return JsonResponse({'MESSAGE': 'NEED_LOGIN'}, status=401)
    
            except jwt.ExpiredSignatureError:
                return JsonResponse({'MESSAGE': 'EXPIRED_TOKEN'}, status=401)
            
            except jwt.DecodeError:
                return JsonResponse({'MESSAGE': 'INVALID_USER_ERROR'}, status=401)
            
            except User.DoesNotExist:
                return JsonResponse({'MESSAGE': 'INVALID_USER_ERROR'}, status=401)
    
        return wrapper
    JWTの適用
    token = request.headers.get("Authorization", None)
    if token:
            token_payload = jwt.decode(token, SECRET, algorithms='HS256')
            user          = User.objects.get(id=token_payload['user_id'])
            request.user  = user
            return self.original_function(self, request, *args, **kwargs)

    ✓投入応用

  • views.py部分
  • class PostingView(View):
        @LoginConfirm
        def post(self, request):
            data  = json.loads(request.body)
    
            try:
                Posting.objects.create(
                    user    = request.user,
                    img_url = data['img_url']
                )
                return JsonResponse({'MESSAGE': 'POSTING_SUCCESS'}, status=201)
    
            except KeyError:
                return JsonResponse({'MESSAGE': 'KEY_ERROR'}, status=400)
    
            except:
                return JsonResponse({'MESSAGE': 'INVALID_USER_ERROR'}, status=401)
    JWTの適用
    @LoginConfirm
  • Result
  • Httpie
  • Database
  • ✓Commentアプリケーション

  • views.py部分
  • class CommentView(View):
        @LoginConfirm
        def post(self, request):
            data  = json.loads(request.body)
    
            try:
                if not User.objects.filter(email=data['user']).exists():
                    return JsonResponse({'MESSAGE': 'INVALID_USER_ERROR'}, status=401)
                
                if not Posting.objects.filter(id=data['posting']).exists():
                    return JsonResponse({'MESSAGE': 'DOES_NOT_EXIST_ERROR'}, status=401)
    
                Comment.objects.create(
                    user     = request.user,
                    posting  = Posting.objects.get(id=data['posting']),
                    contents = data['contents']
                )
                return JsonResponse({'MESSAGE': 'COMMENT_SUCCESS'}, status=201)
    
            except KeyError:
                return JsonResponse({'MESSAGE': 'KEY_ERROR'}, status=400)
    JWTの適用
    @LoginConfirm
  • Result
  • Httpie
  • Database