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 에서 완료
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
})
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.