【翻译】 REST 프레임 워크 JWT 인증 (장고 나머지 프레임 워크 JWT)

JWT 인증 REST 프레임 워크

설명 링크

개요

이 패키지는 제공 장고 REST 프레임 워크JSON 웹 토큰 인증 을 지원합니다.

우리는 조건을 충족해야

  • 파이썬 (2.7, 3.3, 3.4, 3.5)
  • 장고 (1.8, 1.9, 1.10)
  • 장고 REST 프레임 워크 (3.0, 3.1, 3.2, 3.3, 3.4, 3.5)

보안

그리고 더 일반적인 사용 JWT의 다른 일부는,이 모듈은 인증 토큰, 사용자 인증 토큰 검증 요청 DRF 하나의 API 자원 보호를 생성합니다. 실제 요청 매개 변수 자체가 그들이 서명되지 않은 및 변조 될 수있는 수단 문에 포함되지 않습니다 JWT. 당신은 SSL을 통해 / 내용 변조 및 재생 공격의 특정 유형을 방지하기 위해 공개 API 엔드 포인트를 TLS해야한다.

설치

사용 pip설치

$ pip install djangorestframework-jwt

용법

settings.py추가 JSONWebTokenAuthentication장고에의 프레임 워크 휴식 DEFAULT_AUTHENTICATION_CLASSES합니다.

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

에서 urls.py, 사용자 이름과 암호를 허용하는 라우팅 다음 URL 추가 POST토큰을 얻을 수 있습니다.

from rest_framework_jwt.views import obtain_jwt_token
#...

urlpatterns = [
    '',
    # ...

    url(r'^api-token-auth/', obtain_jwt_token),
]

당신이 관리 사용자 password123의 사용자 이름과 암호가있는 경우, 당신은 간단한 테스트 엔드 포인트 터미널에서 다음을 수행하여 제대로 작동 할 수 있습니다.

$ curl -X POST -d "username=admin&password=password123" http://localhost:8000/api-token-auth/

또는, 인증 토큰을 얻을 장고 REST 프레임 워크가 지원하는 모든 콘텐츠 형식을 사용할 수 있습니다. 예를 들면 :

$ curl -X POST -H "Content-Type: application/json" -d '{"username":"admin","password":"password123"}' http://localhost:8000/api-token-auth/

您是不是要找: 당신은 권한이 포함되어야합니다 이제 순서대로 액세스 보호 API를 URL에 : JWT를 < 토큰 > 헤더입니다.

이제, 보호 된 API를 URL에 액세스하려면, 당신은 포함해야 Authorization:JWT <your_token>헤더를.

$ curl -H "Authorization: JWT <your_token>" http://localhost:8000/protected-url/

새로 고침 토큰

경우 JWT_ALLOW_REFRESH사실, 당신은 "새로 고침"수 만료되지 않은 새로운 토큰이 업데이트의 만료 시간이 얻을 토큰을. 다음 URL 형식을 추가 :

from rest_framework_jwt.views import refresh_jwt_token
#  ...

urlpatterns = [
    #  ...
    url(r'^api-token-refresh/', refresh_jwt_token),
]

아래와 같이 기존 토큰 전달 끝점을 새로 고치려면 : {“ token”:EXISTING_TOKEN}. 그에만 유의하시기 바랍니다 만료되지 않은 토큰이 유효합니다. JSON 응답 취득 정상 토큰 끝점 보이는 {“ token”:NEW_TOKEN}동일.

$ curl -X POST -H "Content-Type: application/json" -d '{"token":"<EXISTING_TOKEN>"}' http://localhost:8000/api-token-refresh/

리프레시 재사용 토큰 (토큰 1-> 2- 토큰> 토큰 3), 그러나 (취득한 사용자 명 / 패스워드 인증을 사용하여)이 토큰 체인의 토큰은 원래 시간으로서 저장된다 orig_iat. 당신은 새로 고침 토큰 수 있습니다 JWT_REFRESH_EXPIRATION_DELTA.

일반적인 사용 사례는 암호를 다시 입력 당신이 필요없이 사이트에 "로그온"에 사용자가 원하는 웹 응용 프로그램, 또는 토큰이 만료되기 전에 위협했다. 그들이 뭔가를 할 수있는 마지막 순간에 여전히, 그들이 한 시간 토큰을 가지고 상상해보십시오. 모바일 장치를 사용하여 새로운 토큰을 얻을 가게 이름 / 비밀번호로 할 수 있습니다, 그러나 이것은 브라우저에서 좋은 생각이 아니다. 때마다 사용자로드 페이지, 당신은 만료, 세션을 확장 할 수있는 토큰을 새로 고치십시오에 대한 토큰이 경우, 기존 만료되지 않은 토큰이 있는지 여부를 확인할 수 있습니다. 사용자가 적극적으로 귀하의 사이트를 사용하는 경우 즉, 그들은 그들의 "세션 (세션)"효과를 유지할 수 있습니다.

인증 토큰

일부 마이크로 서비스 아키텍처에서 인증은 단일 서비스에 의해 처리됩니다. 사용자를 확인하기 위해 의뢰 다른 서비스는 서비스의 ID를 확인하는 데이 책임에 로그온하고있다. JWT이 일반적으로 서비스는 사용자가 인증 서비스에 전달에서 수신되며, 확인을 위해 사용자에게 반환 자원의 JWT 효과적인 보호하기 전에 대기하는 대상이된다는 것을 의미합니다.

이 패키지는이 설정 엔드 포인트 지원을 확인하기 위해 사용합니다. 다음 URL 형식을 추가 :

from rest_framework_jwt.views import verify_jwt_token

#...

urlpatterns = [
    #  ...
    url(r'^api-token-verify/', verify_jwt_token),
]

토큰이 유효한 경우, 단말 (200)은 응답을 반송하여 전달된다 인증 토큰은 토큰이 반환된다. 그렇지 않으면 400 잘못된 요청 (요청 오류) 및 토큰 이유는 잘못된 오류가 밖으로 점을 반환합니다.

$ curl -X POST -H "Content-Type: application/json" -d '{"token":"<EXISTING_TOKEN>"}' http://localhost:8000/api-token-verify/

다른 구성

JWT_AUTH = {
    'JWT_ENCODE_HANDLER':
    'rest_framework_jwt.utils.jwt_encode_handler',

    'JWT_DECODE_HANDLER':
    'rest_framework_jwt.utils.jwt_decode_handler',

    'JWT_PAYLOAD_HANDLER':
    'rest_framework_jwt.utils.jwt_payload_handler',

    'JWT_PAYLOAD_GET_USER_ID_HANDLER':
    'rest_framework_jwt.utils.jwt_get_user_id_from_payload_handler',

    'JWT_RESPONSE_PAYLOAD_HANDLER':
    'rest_framework_jwt.utils.jwt_response_payload_handler',

    'JWT_SECRET_KEY': settings.SECRET_KEY,
    'JWT_GET_USER_SECRET_KEY': None,
    'JWT_PUBLIC_KEY': None,
    'JWT_PRIVATE_KEY': None,
    'JWT_ALGORITHM': 'HS256',
    'JWT_VERIFY': True,
    'JWT_VERIFY_EXPIRATION': True,
    'JWT_LEEWAY': 0,
    'JWT_EXPIRATION_DELTA': datetime.timedelta(seconds=300),
    'JWT_AUDIENCE': None,
    'JWT_ISSUER': None,

    'JWT_ALLOW_REFRESH': False,
    'JWT_REFRESH_EXPIRATION_DELTA': datetime.timedelta(days=7),

    'JWT_AUTH_HEADER_PREFIX': 'JWT',
    'JWT_AUTH_COOKIE': None,

}

이 패키지는 JSON 웹 토큰 파이썬 구현 PyJWT를 사용하고, 그들이 사용할 수있는 옵션의 일부를 수정할 수 있습니다.

JWT_SECRET_KEY

이것은 JWT에 서명하는 데 사용되는 키입니다. 만들기는 확인이 안전하고 공유 또는 공개하지 않습니다.
프로젝트의 디폴트 값 settings.SECRET_KEY.

JWT_GET_USER_SECRET_KEY

이 JWT_SECRET_KEY의보다 강력한 버전입니다. 이 토큰을 도난당한 경우 따라서, 소유자가 쉽게 변경할 수 있습니다, 사용자 정의입니다. 이 값을 변경하면 모든 토큰 지정된 사용자가 사용할 수없는 줄 것이다. 값이 함수해야한다, 사용자는 단순히 매개 변수로 받아 그 키를 반환합니다.
기본값은 None.

JWT_PUBLIC_KEY

이다 cryptography.hazmat.primitives.asymmetric.rsa.RSAPublicKey오브젝트의 유형. 이 서명 확인에 대한 JWT를 통과했다. 재정의를 설정 한 후 JWT_SECRET_KEY. 문서 읽기 자세한 내용을. 당신이되어야합니다 JWT_ALGORITHM설정 RS256, RS384또는 RS512하나.
기본값은 None.

JWT_PRIVATE_KEY

이다 cryptography.hazmat.primitives.asymmetric.rsa.RSAPrivateKey오브젝트의 유형. 그것은 JWT의 서명 구성 요소가 서명에 사용됩니다. 재정의를 설정 한 후 JWT_SECRET_KEY. 문서 읽기 자세한 내용을. 당신이되어야합니다 JWT_ALGORITHM설정 RS256, RS384또는 RS512하나.
기본값은 None.

JWT_ALGORITHM

가능한 값은 PyJWT가 지원하는 암호입니다 서명 알고리즘을 .
기본값 “ HS256”.

JWT_VERIFY

암호가 잘못되면, 그것은을 던져 jwt.DecodeError당신을 말하고. 당신은 여전히 할 수 있습니다 JWT_VERIFY설정 False페이로드를 얻을 수 있습니다.
기본값 True.

JWT_VERIFY_EXPIRATION

당신은 할 수 있습니다 JWT_VERIFY_EXPIRATION설정 False확인하기 때문에 시간을 종료 할 수 있습니다. 만기 검증이없는 경우, JWT는 항상 공격자가 무기한 유출 토큰을 사용할 수있는 수단이 될 것입니다.
기본값 True.

JWT_LEEWAY

이것은 당신이 아니라 아주 멀리 과거에 만료 시간을 확인할 수 있습니다. 예를 들어, 그래서 어떤이, 당신이 페이로드 JWT이있는 경우, 유효 시간은 작성 후 30 초로 설정되어 있지만, 당신은 당신이 10 초로 시간을 스윙 할 수 있습니다, 때로는 30 초에 처리됩니다 알고 마진.
기본값은 0초.

JWT_EXPIRATION_DELTA

이것은 파이썬 datetime.timedelta의 예입니다. 그것은 만료 시간을 설정하는 datetime.utcnow ()에 추가됩니다.
기본값 datetime.timedelta(seconds = 300)(5分钟).

JWT_AUDIENCE

이 토큰에 따라서, 문자열이다 aud(존재하는 경우) 검사 필드.
기본값 None합니다 (JWT에 존재하는 경우 aud, 실패).

JWT_ISSUER

이에 따라 토큰 문자열입니다 iss체크 필드.
기본값은 None합니다 (JWT에 확인하지 iss).

JWT_ALLOW_REFRESH

토큰 새로 고침 기능을 사용합니다. 에서 rest_framework_jwt.views.obtain_jwt_token토큰 발행해야합니다 orig_iat필드. 기본값은 False.

JWT_REFRESH_EXPIRATION_DELTA

새로 고침 토큰 제한입니다 datetime.timedelta예. 이것은 미래의 토큰 캔 리프레시 시간 후 원래 토큰입니다.
기본값 datetime.timedelta(days = 7)(7天).

JWT_PAYLOAD_HANDLER

토큰 페이로드를 생성하는 사용자 정의 기능을 지정합니다.

JWT_PAYLOAD_GET_USER_ID_HANDLER

당신이 저장하는 경우 user_id다른 페이로드에 대한 기본 핸들러를, 페이로드에서 얻기 위해이 기능을 구현하시기 바랍니다 user_id. 참고 :하지 않는 것이 좋습니다 JWT_PAYLOAD_GET_USERNAME_HANDLER.

JWT_PAYLOAD_GET_USERNAME_HANDLER

당신이 저장하는 경우 username다른 페이로드에 대한 기본 핸들러를, 페이로드에서 사용자 이름을 얻기 위해이 기능을 구현하시기 바랍니다.

JWT_RESPONSE_PAYLOAD_HANDLER

응답 데이터 로그인 후 반환 또는 갱신을 제어하기위한 담당합니다. 예를 들면, 포함, 사용자 표현의 순서를 지정 응답을 반환하도록 재정의. 기본 반환 JWT토큰.

def jwt_response_payload_handler(token, user=None, request=None):
    return {
        'token': token,
        'user': UserSerializer(user, context={'request': request}).data
    }

기본값은 {'token': token}

JWT_AUTH_HEADER_PREFIX

당신은 토큰 값의 접두사로 전송되는 인증 헤더를 수정할 수 있습니다. 기본 값 JWT. PR #. 4 이 패키지의 사용을 허용하는 결정을 소개 함과 동시에 OAuth2를 DRF에서.

토큰과 인증 헤더에 대한 또 다른 일반적인 값입니다 Bearer.

기본값 JWT.

외부뿐만 아니라뿐만 아니라 인증 헤더를 사용하는 경우 http cookie토큰으로 효율적인 전송을, 그것은 문자열로 설정 될 수있다. 여기에서 설정 한 문자열 요청 토큰 응답 헤더의 쿠키 세트의 이름으로 사용됩니다. 토큰 검증 프로세스는 (설정 한 경우) 쿠키를 조사 할 것입니다. 요청 헤더와 쿠키를 포함하는 경우, "인증"헤더는 우선 순위가 있습니다.

기본값은 “None”토큰을 생성 할 때 쿠키를 설정하지, 또는 인증 토큰의 시간에 동의하지 않습니다.

확장 JSONWebTokenAuthentication

이제 JSONWebTokenAuthentication는 JWT는 헤더 나 쿠키 (구성된 경우) (참조에 나타납니다 가정 JWT_AUTH_COOKIE을 ). JWT 사양 (다음을 참조하십시오 그렇게 할 필요는 없다 서비스 호출 ). 예를 들어, JWT는 쿼리 문자열에 나타날 수 있습니다. 사용자가 (HTML에서 예를 들어, SRC 요소) 헤더를 설정할 수없는 경우에, 당신은 쿼리 문자열의 JWT를 전송하는 기능이 필요합니다.

이 기능을 달성하기 위해, 사용자는 사용자 정의 쓸 수 있습니다 身份验证:

class JSONWebTokenAuthenticationQS(BaseJSONWebTokenAuthentication):
    def get_jwt_value(self, request):
         return request.QUERY_PARAMS.get('jwt')

권장 BaseJSONWebTokenAuthentication새로운 기본 클래스, 아니 HTTP 헤더 구문 분석 논리이다.

새로운 토큰 매뉴얼 작성

때때로 당신은 즉시 계정을 생성 한 후 사용자에게 반환되는 토큰으로 수동으로 토큰을 생성해야 할 수도 있습니다. 당신은 다음 단계를 수행 할 수 있습니다 :

from rest_framework_jwt.settings import api_settings

jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER

payload = jwt_payload_handler(user)
token = jwt_encode_handler(payload)

추천

출처www.cnblogs.com/cpl9412290130/p/11957829.html