drf 프레임 워 크 에서 jwt 인증 및 사용자 정의 jwt 인증

자기 총화
drf 프레임 워 크 중 jwt
모듈 설치 :http://getblimp.github.io/django-rest-framework-jwt/
그 는 제3자 의 개원 프로젝트 다. : pip install djangorestframework-jwt
설정 한 jwt 사용 하기
from django.urls import path
from rest_framework_jwt.views import obtain_jwt_token
urlpatterns = [
    path('login/', obtain_jwt_token),
]
'''
path('login/', obtain_jwt_token)     path('login/', ObtainJSONWebToken.as_view())
             
obtain_jwt_token = ObtainJSONWebToken.as_view()     #  
refresh_jwt_token = RefreshJSONWebToken.as_view()   #  
verify_jwt_token = VerifyJSONWebToken.as_view()     #  
'''

테스트 인터페이스: post 요청
"""
postman  post  

  :http://api.luffy.cn:8000/user/login/

  :
{
    "username":"admin",
    "password":"admin"
}
"""

작업 원리
"""
jwt:json web tokens   json   web          

jwt   : .  .  

 :      、       、       
  :    、    
  : 、  、  

{     ,  base64    }.{      ,  base64    }.{    、     、     ,  hs256    }

base64     
hash256      
           ,         ,                
"""

3. 3 대 인증
세 션 인증
rest_framework. authentication. ession Authentication ajax 인증 요청: 쿠키 에 sessionid, csrftoken 을 휴대 하고 요청 머리 에 x - csrftoken 을 휴대 해 야 합 니 다.
jwt 인증
session 인증 과 달리 그 는 더 이상 시 계 를 찾 지 않 아 도 된다 시 계 를 찾 으 면 된다.
rest_framework_jwt. authentication. JSON WebToken Authentication ajax 인증 요청: 요청 헤더 에 authorization 을 가 져 가 야 합 니 다. 값 은 jwt 빈 칸 token 입 니 다.
jwt 기반 기타sessionid
1) 사용자 정의 인증 클래스, BaseAuthentication (또는 하위 클래스) 계승, authenticate 2 재 작성) authenticate 에서 완료
  • 인증 표지 받 기 auth
  • 사용자 user 역 해석
  • 앞의 두 단계 작업 이 실 패 했 습 니 다. None 로 돌아 가기 = > 관광객
  • 앞의 두 단계 작업 이 성공 적 으로 user, auth = > 로그 인 사용자 user: 특정한 지점 에서 이상 을 던 지면 실패 = > 불법 사용자
  • 를 직접 정의 합 니 다.
    4. 사용자 정의 인증, jwt 기반
    가장 간단 한 수정
    from rest_framework.exceptions import AuthenticationFailed
    import jwt
    from rest_framework_jwt.authentication import BaseJSONWebTokenAuthentication
    from rest_framework_jwt.authentication import jwt_decode_handler
    
    from rest_framework.authentication import BaseAuthentication
    def authenticate(self, request):
        auth =  request   
        user =  auth   
        if not user:
            return None
        return user, auth
    'DEFAULT_AUTHENTICATION_CLASSES': [
        '            ',
    ],
    jwt
    authentication_classes = [            ]

    5. 사용자 정의 권한 관련 setting
    """
      :
    1)AllowAny:      ,        True
    2)IsAuthenticated:       
          request.user request.user.is_authenticated   
    3)IsAuthenticatedOrReadOnly:    ,       
        get、option、head      
                 request.user request.user.is_authenticated
    4)IsAdminUser:       
           request.user request.user.is_staff    is_staff(             )
        
    
       :  auth Group Permission 
    1)      ,  BasePermission,  has_permission
    2)has_permission   
               user <= request.user
          user       
                  False =>    
                  True =>    
    """
    #              
    from rest_framework.permissions import BasePermission
    
    class AdminPermission(BasePermission):
        #   BasePermission,  has_permission
        def has_permission(self, request, view):
            #    ,  True
            #    ,  False
            user = request.user
            if not user:
                return False
            #            (      Group          )
            if not user.groups.filter(name='   '):
                return False
            #                   
            return True
    'DEFAULT_PERMISSION_CLASSES': [
        '            ',
    ],
    permission_classes = [            ]

    6. 사용자 정의 접근 횟수 설정
    """
      :
    1)AnonRateThrottle:   IP     
    2)UserRateThrottle:   IP       
       settings.py 
    'DEFAULT_THROTTLE_RATES': {
        'user': '10/min',  #             10 
        'anon': '3/min',  #          3 
    }
         :
    class TempAPIView(APIView):
        ...
        throttle_classes = [AnonRateThrottle, UserRateThrottle]
        
        
    
       :  auth Group Permission 
    1)      ,  SimpleRateThrottle,  get_cache_key,  scope
        SimpleRateThrottle         allow_request、wait
    2)scope settings.py DEFAULT_THROTTLE_RATES    
    3)get_cache_key   
               ident <= request   
                 None =>    
                        =>    
    """

    사용자 정의 주파수 클래스: 1 분 에 한 번 만 인터페이스 에 접근 할 수 있 습 니 다.
    from rest_framework.throttling import SimpleRateThrottle
    
    class ThreeMinRateThrottle(SimpleRateThrottle):
        scope = 'sms'
        def get_cache_key(self, request, view):
            #         
            ident = request.data.get('mobile')
            if not ident:  #        ,  None         
                return None
            return self.cache_format % {
                'scope': self.scope,
                'ident': ident
            }
    # settings.py 
    'DEFAULT_THROTTLE_RATES': {
        'user': '10/min',  #             10     
        'anon': '3/min',  #          3 
        'sms': '1/min',  #       ,     user  anon
    }
        
    class UserListAPIView(ListAPIView):
        throttle_classes = [          ]

    원본 코드 에서 시간 에 관 한 코드
        def parse_rate(self, rate):
            """
            Given the request rate string, return a two tuple of:
            , 
            """
            if rate is None:
                return (None, None)
            num, period = rate.split('/')
            num_requests = int(num)
            duration = {'s': 1, 'm': 60, 'h': 3600, 'd': 86400}[period[0]]
            return (num_requests, duration)
    setting 모든 우리 쪽 은 반드시 min 대표 로 나 누 는 것 이 아니 라 시작 이 m 이면 된다.
    7. 전역 설정 유효 시간 및 jwt 이름
    import datetime
    JWT_AUTH = {
        'JWT_EXPIRATION_DELTA': datetime.timedelta(seconds=30000),#d    
        'JWT_AUTH_HEADER_PREFIX': 'TOKEN',  #               ,           token      
    }
    USER_SETTINGS = getattr(settings, 'JWT_AUTH', None)  #    JWT_AUTH    
    ......
    'JWT_EXPIRATION_DELTA': datetime.timedelta(seconds=300),
    'JWT_AUTH_HEADER_PREFIX': 'JWT',       jwt  

    8. jwt 자체 맞 춤 형 가 져 오기 token / JSON WebTokenSerializer 클래스
    payload = jwt_payload_handler(user)
    
    return {
        'token': jwt_encode_handler(payload),
        'user': user
    }

    저희 가 만약 에 몇 가지 관건 적 인 점 을 정 의 했 으 면 좋 겠 어 요. 하 나 는 방법 이에 요.
    하 나 는 user 대상 입 니 다.
    모든 것 을 저희 가 로그 인 할 때 token 을 던 지 려 면...
    class LoginJWTAPIView(APIView):
        authentication_classes = ()
        permission_classes = ()
        def post(self, request, *args, **kwargs):
            # username           ,                    
            username = request.data.get('username')
            password = request.data.get('password')
    
            #   username         =>        
            if re.match(r'1[3-9][0-9]{9}', username):
                try:
                    #      user    jwt-token
                    user = models.User.objects.get(mobile=username)
                except:
                    return APIResponse(1, '      ')
    
            #       
    
            #     
            else:
                try:
                    #      user    jwt-token
                    user = models.User.objects.get(username=username)
                except:
                    return APIResponse(1, '      ')
    
            #      ,       token
            if not user.check_password(password):
                return APIResponse(1, '    ')
            payload = jwt_payload_handler(user)
            token = jwt_encode_handler(payload)
            return APIResponse(0, 'ok', results={
                'username': user.username,
                'mobile': user.mobile,
                'token': token
            })

    좋은 웹페이지 즐겨찾기