Python Django DRFフレームワークJWT Auth

19122 ワード

RESTフレームワークJWT Auth
Django REST FrameworkのJSON Webトークン認証サポート
概観このパッケージはDjango RESTフレームワークにJSON Webトークン認証サポートを提供する.
Python(2.7,3.3,3.4,3.5)Django(1.8,1.9,1.10)Django RESTフレームワーク(3.0,3.1,3.2,3.3,3.4,3.5)は、JWTのより典型的な使用法とは異なり、DRF保護APIリソースの1つを要求するユーザーを検証するために認証トークンのみを生成します.実際の要求パラメータ自体はJWTクレームに含まれていません.これは、署名がなく、改ざんされる可能性があることを意味します.SSL/TLSのみでAPIのエンドポイントを公開し、コンテンツの改ざんや再放送の攻撃を防止する必要があります.
インストールインストールpipを使用...
 pip install djangorestframework-jwt

使用法はあなたのsettingsです.py,JSOnWebTokenAuthenticationをDjango RESTフレームワーク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),
]

ユーザー名adminとパスワードpassword 123を使用してユーザーを作成した場合は、端末で次の操作を実行することで、エンドポイントが正常に動作しているかどうかを簡単にテストできます.
$ curl -X POST -d "username=admin&password=password123" http://localhost:8000/api-token-auth/

または、Django RESTフレームワークでサポートされているすべてのコンテンツタイプを使用して、認証トークンを取得できます.例:
$ curl -X POST -H "Content-Type: application/json" -d '{"username":"admin","password":"password123"}' http://localhost:8000/api-token-auth/

保護されたAPIにアクセスするには、Authorization:JWTタイトルを含める必要があります.
$ curl -H "Authorization: JWT " http://localhost:8000/protected-url/

トークンをリフレッシュJWT_の場合ALLOW_REFRESHがTrueであれば、未期限のトークンを「リフレッシュ」して、更新期限のある新しいトークンを得ることができます.このように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":""}' http://localhost:8000/api-token-refresh/

トークンリフレッシュ(トークン1->トークン2->トークン3)を繰り返し使用できますが、このトークンチェーンにはorig_iat.新しいトークンJWT_しか保持できませんREFRESH_EXPIRATION_DELTA.
典型的な例は、パスワードを再入力する必要がなく、ユーザーにサイトを「ログイン」させたり、トークンが期限切れになる前に意外に蹴り出されたりするWebアプリケーションです.想像してみてください.彼らは1時間のトークンを持っています.ただ、彼らがまだ何かをしている最後の瞬間です.モバイルデバイスを使用すると、ユーザー名/パスワードを格納して新しいトークンを取得できますが、ブラウザでは良いアイデアではありません.ユーザーがページをロードするたびに、既存の未期限トークンが存在するかどうかを確認できます.期限切れに近づいている場合は、セッションを拡張するためにリフレッシュします.言い換えれば、ユーザーが積極的にWebサイトを使用している場合、彼らは「セッション」を生きているままにすることができます.
認証トークンは、いくつかのマイクロサービスアーキテクチャにおいて、認証は単一のサービスによって処理される.その他のサービス委任は、ユーザーがこの認証サービスにログインした責任を確認します.これは、通常、サービスがユーザから受信したJWTを認証サービスに渡し、保護されたリソースをユーザに返す前にJWTの有効な確認を待つことを意味する.
この設定は、検証エンドポイントを使用してこのパッケージでサポートされます.次のURLモードを追加します.
 from rest_framework_jwt.views import verify_jwt_token

    #...

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

トークンを検証エンドポイントに渡すと200応答が返され、トークンが有効であればトークンが返されます.そうでなければ、400 Bad Requestとトークンが無効であることを識別するエラーが返されます.
$ curl -X POST -H "Content-Type: application/json" -d '{"token":""}' http://localhost:8000/api-token-verify/

その他の設定は、Django RESTフレームワーク自体を使用する方法と同様に、他の設定を上書きできます.以下に、使用可能なすべてのデフォルト値を示します.
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 Web Token Pythonを使用して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は、RS 256、RS 384、またはRS 512に設定する必要があります.
デフォルトはNoneです.
JWT_PRIVATE_KEYこれはタイプのオブジェクトcryptographyです.hazmat.primitives.asymmetric.rsa.RSAPrivateKey.JWTの署名コンポーネントに使用されます.JWT_SECRET_KEY設定時に上書きします.詳細については、ドキュメントを参照してください.JWT_ALGORITHMは、RS 256、RS 384、またはRS 512に設定する必要があります.
デフォルトはNoneです.
JWT_ALGORITHMの可能な値は、PyJWTにおける署名を暗号化するための任意のサポートアルゴリズムである.
デフォルトは「HS 256」です.
JWT_VERIFY秘密が間違っているとjwtを引き起こす.DecodeError、そう言ってください.JWT_を設定することもできます.VERIFYtoは、ペイロードFalseを取得するために使用される.
デフォルトはTrueです.
JWT_VERIFY_EXPIRATION JWT_を設定できますVERIFY_EXPIRATIONは、クローズ期限のFalseを検証します.期限切れの検証がなければ、JWTは永遠に存在し、攻撃者が漏洩したトークンを無期限に使用できることを意味する.
デフォルトはTrueです.
JWT_LEEWAYこれにより、過去の期限が遠くないことを確認できます.たとえば、作成後30秒に有効なJWT負荷がある場合は、作成後30秒に設定されていますが、30秒後に処理される場合があることを知っていれば、10秒の余裕を設定して余裕を得ることができます.
デフォルトは0秒です.
JWT_EXPIRATION_DELTAこれはPythonの一例datetimeです.timedelta.このdatetimeが追加されます.utcnow()で期限を設定します.
デフォルトはdatetime.timedelta(seconds=300)(5分).
JWT_AUDENCEこれは、audトークンのフィールドに基づいてチェックされる文字列です(存在する場合).
デフォルトはNoneです(audがJWT上に存在する場合は失敗します).
JWT_ISSUER issトークンフィールドに基づいてチェックされる文字列です.
デフォルトはNoneです(issJWTはチェックしないでください).
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デフォルトのペイロード・ハンドラと異なるユーザー名を格納する場合は、この機能を実装してユーザー名をペイロードから取得します.
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トークンとともに送信する必要があるAuthorizationヘッダ値接頭辞を変更できます.デフォルトはJWTです.この決定はPR#4に導入され、DRFでこのパッケージとOAuth 2を同時に使用できるようになった.
トークンと認証ヘッダに使用されるもう一つの一般的な値はBearerです.
デフォルトはJWTです.
JWT_AUTH_COOKIEは、Authorizationヘッダに加えてhttpクッキーをトークンとして有効に転送する場合、文字列に設定できます.ここで設定した文字列は、トークンを要求するときに応答ヘッダで設定されるクッキー名として使用されます.設定すると、トークン検証プログラムもこのクッキーを表示します.リクエストにヘッダーとクッキーがある場合は、「認可」ヘッダーが優先されます.
デフォルトはNoneで、トークンの作成時にクッキーは設定されず、検証時には受け入れられません.
拡張JSOnWebTokenAuthentication JSOnWebTokenAuthenticationでは、JSOnWebTokenAuthenticationでは、JWTがタイトルにあるか、クッキーが構成されている場合を想定します(JWT_AUTH_COOKIEを参照).JWT仕様では、このようなことは必要ありません(サービス電話をかけるを参照).たとえば、JWTがクエリ文字列に表示される場合があります.ユーザーがタイトルを設定できない場合(HTMLのsrc要素など)、クエリー文字列にJWTを送信する機能が必要です.
この機能を実現するには、ユーザーはカスタムAuthenticationを作成できます.
class JSONWebTokenAuthenticationQS(BaseJSONWebTokenAuthentication):
    def get_jwt_value(self, request):
         return request.QUERY_PARAMS.get('jwt')

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)