장고 REST 프레임 워크 JWT 학습

1.JWT 학습

사용자 등록 또는 로그인 후, 우리는 사용자의 로그인 상태를 기록, 또는 사용자에 대한 인증 자격 증명을 만들려고합니다. 우리는 더 이상 JSON 웹 토큰 인증 메커니즘을 사용, 세션 인증 메커니즘을 사용하지 않습니다.

JSON 웹 토큰 (JWT)가, 개방형 표준 JSON을 기반으로 네트워크 응용 프로그램 실행 환경 사이를 통과하기 위해 문이다 ((RFC 7519). 토큰은 컴팩트하고 안전, 특히 단일 분산 된 사이트 수 있도록 설계되었습니다 사인온 (SSO) 시나리오 .JWT 문은 일반적으로 서버 자원을 얻기 위해 ID 정보를 인증 제공하고 사용자 ID와 서비스 제공 업체 전송하는 데 사용됩니다, 당신은 또한해야 몇 가지 여분의 다른 비즈니스 로직을 추가 할 수 있습니다 토큰이 직접 인증을 위해 사용할 수있는 문 정보는 암호화 할 수있다.

1.1 JWT 조성물

세 가지 정보로 구성된 문자열에 JWT는 정보 텍스트의이 세 가지를 사용하는 .링크가 JWT 문자열을 구성하여. 이 같이 :

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

첫 번째 부분에서는 우리는 헤드 (헤더), 우리 (평면에 담지 항목 유사한 페이로드)의 부하를 호출하는 두 번째 부분을 호출하고, 셋째 부분은 비자 (서명)이다.

1.1.1 헤더

JWT 헤드는 두 가지 정보를 전달 :

  • 유형 선언, 여기 JWT입니다

  • 암호화 알고리즘의 주장은 일반적으로 직접 HMAC의 SHA256를 사용

JSON이 같은 전체 머리 :

{
   ' 일반 ' : ' JWT ' ,
   ' ALG ' : ' HS256 ' 
}

이어서 헤드 Base64로 암호화 (대칭을 해독 할 수있는 암호화 된), 상기 제 1 부분을 구성한다.

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9

1.1.2 페이로드

로드 로컬 스토리지는 유효 정보이다. 이름은 항공기 수행 등의 제품에 특별히 의미, 이러한 효과적인 정보는 세 부분으로 구성

  • 표준 신고서

  • 공공 문

  • 개인 성명

표준 신고서 (권장하지만, 사용이 필수는 아닙니다) :

  • ISS : JWT 발행

  • 서브 : 사용자에 대한 JWT

  • AUD : 수신 측 JWT

  • EXP : JWT 만료 시간, 만료 날짜는 시간의 문제보다 커야합니다

  • NBF는 다음 JWT 이전에 정의 된 몇시에 사용할 수 없습니다.

  • IAT는 : 시간의 문제를 JWT

  • JTI : JWT 고유 ID는, 주로 재생 공격을 방지하기 위해, 한 번 토큰으로 사용됩니다.

공공 문 : 공공 선언 어떤 정보가 필요한 정보 또는 다른 비즈니스 요구 사항을 추가 할 수있는 사용자에 대한 일반 정보를 추가 할 수 있지만, 민감한 정보가 추가 할 클라이언트의 일부를 해독 할 수 있기 때문에 사용하지 않는 것이 좋습니다.

개인 성명 : base64로 정보의 일부는 일반 텍스트로 분류 될 수 있음을 의미 대칭을 해독하기 때문에 개인 문은 일반적인 정의로 성명 공급자와 소비자 인은 일반적으로 민감한 정보를 저장하지 않는 것이 좋습니다.

페이로드를 정의합니다 :

{
   " 하위 " : " 1234567890 " ,
   " 이름 " : " 홍길동 " ,
   " 관리자 " 는 true 
}

base64로 암호화는 JWT의 제 2 부분을 얻었다.

eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9

1.1.3 서명

JWT는 비자 정보의 세 번째 부분은,이 비자 정보는 세 부분으로 구성되어 있습니다 :

  • 헤더 (64 기수 후)

  • 페이로드 (64 기수 후)

  • 비밀

헤더 부 후의베이스 64베이스 64 후에 암호화하여 페이로드를 암호화 할 필요가 .선언 염 암호화 헤더 다음 문자열 연결 조성물 등을 secret조합하여 암호화하고, 제 3 부분은 JWT를 구성한다.

// 당신이 아날로그 jwttoken를 생성하려면 자바 스크립트, [주 : 의사 코드] 다음 코드를 생성하기 위해 사용될 수있다 
var에 encodedString = base64UrlEncode (헤더) + ' . ' + Base64UrlEncode (페이로드); 

var에 서명 = HMACSHA256 (encodedString, ' 비밀 ' ); // TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

이러한 세 부분으로 .연결된 전체 문자열은 최종 JWT를 구성 :

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

참고 : 비밀은 서버 측에 저장되어, 문제가 서버 측에서 또한 JWT를 생성, 비밀은 JWT의 발행 및 JWT를 인증하는 데 사용됩니다, 그래서 어떤 시나리오가 갈 공개해서는 안에는, 서버의 개인 키입니다. 클라이언트가 비밀을 알게되면, 클라이언트가 자체 서명 JWT 위로가 될 수 있다는 것을 의미한다.


발행 및 JWT의 검증을 위해, 우리는 완료 장고 REST 프레임 워크 JWT 확장을 사용할 수 있습니다.

문서 웹 사이트 http://getblimp.github.io/django-rest-framework-jwt/

1.2 장고 설치된 구성 JWT

1.2.1 설치

djangorestframework-JWT 설치 PIP

구성 파일에서 1.2.2 설정

REST_FRAMEWORK = {
     ' DEFAULT_AUTHENTICATION_CLASSES ' (
         ' rest_framework_jwt.authentication.JSONWebTokenAuthentication ' ,
         ' rest_framework.authentication.SessionAuthentication ' ,
         ' rest_framework.authentication.BasicAuthentication ' , 
    ) 
} 

수입 날짜 
JWT_AUTH = {
     ' JWT_EXPIRATION_DELTA ' : datetime.timedelta (일 = 1 ) 
}

참고 : JWT_EXPIRATION_DELTA 토큰 유효 지정

1.3 생성 JWT

문서의 장고 REST 프레임 워크 JWT 확장은 JWT 발행 설명서의 방법을 제공

 rest_framework_jwt.settings 가져 api_settings 

jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER 
jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER 

페이로드 = jwt_payload_handler (사용자) 
토큰 = jwt_encode_handler (페이로드)

사용자 등록 또는 로그인이 성공 후에는 향후 직렬에서 사용자 정보를 반환 할 수 있습니다 토큰을 반환합니다.

2. JWT 기준 인증 전방 및 후방 단부를 달성

2.1 백엔드 구현 로그인 인증 인터페이스

라우팅 urls.py에서 하위 응용 프로그램 사용자에

에서 rest_framework_jwt.views 가져 obtain_jwt_token 

urlpatterns의 = [ 
    경로 (R ' 허가 / ' , obtain_jwt_token 이름 = " 승인 " ) 
]

다음으로, 우리는 우편 배달부에 의해 다음과 같은 기능을 테스트 할 수 있습니다

1553572597916

JWT 저장 2.2 전단

우리는 또한 브라우저의 로컬 메모리에 저장할 수있는 쿠키에 저장 JWT 수 있습니다, 우리는 브라우저 로컬 스토리지에 저장

로컬 저장소 브라우저 sessionStorage와 localStorage를 두 가지 방법을 제공합니다 :

  • sessionStorage의 브라우저는 소멸된다 폐쇄

  • 로컬 스토리지 장기 효과

용도

sessionStorage. 변수 명 = 변수 값이 // 데이터 저장 
sessionStorage를. 변수 이름을   // 데이터를 읽어 
sessionStorage.clear를 ()   // 제거 모든 sessionStorage 데이터 저장 

로컬 스토리지를. 변수 이름 // = 변수 값 데이터 저장 
로컬 스토리지. 변수 이름을   // 데이터 읽기 
) (localStorage.clear를   //이 로컬 스토리지에 저장된 모든 데이터를 지 웁니다

이상 2.3 착륙 조건

JWT는 사용자 이름과 암호를 수신 할 때, 로그인 뷰를 확장뿐만 아니라, 장고의 인증 시스템을 제공 전화 인증합니다 ()를 사용자 이름과 암호가 올바른지 확인합니다.

우리는 사용자 이름이나 전화 번호 중 하나가 될 수있는 인증 백엔드 장고 인증 시스템 (주로 방법을 인증) 수정하여 로그인 계정을 지원할 수 있습니다.

인증 백엔드 장고 인증 시스템이 django.contrib.auth.backends.ModelBackend을 상속 할 필요가 수정하고 인증 할 방법을 재정의합니다.

authenticate(self, request, username=None, password=None, **kwargs)매개 변수 설명 방법 :

  • 요청 인증 요청 개체

  • 사용자 이름 사용자가 제공이 인증 계정

  • 이 암호 인증 암호를 제공합니다

우리는, 당신은 또한 전화 번호로 로그인 할 수있는 사용자를하게하거나 사용자 이름으로 로그인 할 다음을 인증 방법에 대한 사용자 이름 매개 변수는 것을 의미합니다 사용자 이름 또는 전화 번호.

아이디어는 방법을 인증 재 작성 :

  1. 사용자 사용자 개체 매개 변수의 이름을 찾습니다 따르면, 사용자 이름 매개 변수는 사용자 이름이 될 수 있습니다, 그것은 전화 번호 수 있습니다

  2. 는 사용자 개체를 찾을 수 있다면, 올바른 암호 사용자 개체 여부를 확인은 check_password 메소드를 호출

사용자 / utils.py의에서 쓰기 :

에서 django.contrib.auth.backends 가져 오기 ModelBackend
 에서 .models 가져 오기 사용자
 로부터 django.db.models 가져 오기 Q
 가져 오기 다시 

DEF의 : get_user_by_account (계정)
     "" " 사용자 계정 정보를 기반으로 수집 모델을 " "" 
    은 try :
         #을 re.match 경우 ( '^ 1 [3-9] \ {D} $ 9..'계정) 
        #      # 전화 번호 
        #의      사용자 = User.objects.get (= 모바일 계정) 
        # 다른 : 
        #의      # 아이디 
        #의      사용자 = User.objects 갔지 (사용자 이름 = 계정) 

        사용자| User.objects.get는 = ((사용자 이름 = Q를 Q는 (모바일) 계정을 = 계정)) 

    제외 : User.DoesNotExist 
        사용자 = 아무도 

    돌아 오지 사용자 


클래스 : UsernameMobileAuthBackend (ModelBackend)
     DEF 인증 용 (자체, 요청, 사용자 이름 = 없음, 암호 = 없음, ** kwargs로) :
         #의 로그를 확인하는 
        사용자 = ) get_user_by_account (사용자 이름을 

        #의 계정 암호에 의해 검증 될 필요가 현재 방송국이 활성 상태인지 여부를 잘 판단 
        만약에 isinstance (사용자, 사용자)  user.check_password (비밀번호 ) self.user_can_authenticate (사용자) :
             반환 사용자를

장고는 우리의 사용자 정의 인증 백엔드에 사용되는 구성 파일에 정보의 settings.py

AUTHENTICATION_BACKENDS = [
     ' users.utils.UsernameMobileAuthBackend ' , 
]

승인

추천

출처www.cnblogs.com/gbq-dog/p/10991662.html