DRF - JWT 軽く触ってみる
作ってるアプリをDjango×Reactにするため、DjangoRESTframeworkを利用しています
認証機能にはDjango REST framework JWT を使うと良いということなので、公式?チュートリアル(Usage)をみてやってみる
Securityについて
セキュリティについては、以下の記述がありました。
他の典型的なJWTトークンと違って、DRF-JWTモジュールは保護されたDRFに対して、
「リクエストを送るユーザが誰なのか」ということを認証するトークンのみ発行するそのため、実際のJWTトークンのClaim内には、リクエスト内容は含まれない
つまり、ユーザからのリクエストは署名されていない、もしくは改ざんされている可能性がある
これを回避するためには、APIエンドポイントは必ずSSL/TLSを利用して守ってあげる必要がある
jwt インストール
pip で install するだけ!
$ pip install djangorestframework-jwt
settings.py に設定追加
DEFAULT_PERMISSION_CLASSES
と DEFAULT_AUTHENTICATION_CLASSES
を追加
おそらく JSONWebTokenAuthentication
が DEFAULT_AUTHENTICATION_CLASSES に入ってたらOK
それ以外の設定は今のところ詳細不明
# drf settings
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',
),
}
url.py に設定追加
urlpatterns = [
...
path('api-token-auth/', obtain_jwt_token),
]
この時点でもうjwt認証ができるようになっている
- token 発行
urlにて設定したアドレスにユーザ名とパスワードを入れてPOSTすると、トークン情報が返ってくる
$ curl -X POST -d "username=admin&password=password" http://127.0.0.1:8000/api-token-auth/
# 長いので略
{"token":"xxxx.yyyy.zzzz"}
- トークンを利用してGET
入手したtoken情報をhttpのリクエストヘッダに入れると、APIでJSONを返せるようになる
$ curl -H "Authorization:jwt <token情報>" http://127.0.0.1:8000/api名
で試せる
$ curl -H "Authorization:jwt xxxx.yyyy.zzzz" http://127.0.0.1:8000/snippets/
{"count":5,"next":null,"previous":null,"results":.略.}
Refrash, Verify
同様にして、refresh と verify のURLを追加すると、初期化と認証機能が追加できる
from rest_framework_jwt.views import obtain_jwt_token, refresh_jwt_token, verify_jwt_token
urlpatterns = [
path('', include('snippets.urls')),
path('api-token-auth/', obtain_jwt_token),
path('api-token-refresh/', refresh_jwt_token),
path('api-token-verify', verify_jwt_token),
path('api-auth/', include('rest_framework.urls', namespace='rest_framework')),
]
- refresh
refresh機能はデフォルト設定では無効になっているので、
設定追加する
Falseのままアクセスすると {"non_field_errors":["orig_iat field is required."]}
と返ってくる
JWT_AUTH = {
'JWT_ALLOW_REFRESH': True,
}
refresh実行
$ curl -X POST -H "Content-Type: application/json" -d '{"token":"xxxx.yyyy.zzzz"}' http://127.0.0.1:8000/api-token-refresh/
# 別のTokenが返ってくる
{"token":"xxxx.aaaa.bbbb"}
- verify
$ curl -X POST -H "Content-Type: application/json" -d '{"token":"xxxx.yyyy.zzzz"}' http://127.0.0.1:8000/api-token-verify/
# status code 202 で返ってくる
{"token":"xxxx.yyyy.zzzz"}
おわり
他にもいろいろ設定をいじれるようですが、
この記事では一番簡単に実装できる部分だけ紹介という形になります。
この後は実際のログイン認証機能作成だ