LoginSignup
0
0

More than 1 year has passed since last update.

Django REST framework - jwt 軽く触ってみる

Last updated at Posted at 2022-01-19

DRF - JWT 軽く触ってみる

作ってるアプリをDjango×Reactにするため、DjangoRESTframeworkを利用しています
認証機能にはDjango REST framework JWT を使うと良いということなので、公式?チュートリアル(Usage)をみてやってみる

公式Usage

Securityについて

セキュリティについては、以下の記述がありました。

他の典型的なJWTトークンと違って、DRF-JWTモジュールは保護されたDRFに対して、
「リクエストを送るユーザが誰なのか」ということを認証するトークンのみ発行する

そのため、実際のJWTトークンのClaim内には、リクエスト内容は含まれない
つまり、ユーザからのリクエストは署名されていない、もしくは改ざんされている可能性がある

これを回避するためには、APIエンドポイントは必ずSSL/TLSを利用して守ってあげる必要がある

jwt インストール

pip で install するだけ!

$ pip install djangorestframework-jwt

settings.py に設定追加

DEFAULT_PERMISSION_CLASSESDEFAULT_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."]} と返ってくる

settings.py
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"}

おわり

他にもいろいろ設定をいじれるようですが、
この記事では一番簡単に実装できる部分だけ紹介という形になります。

この後は実際のログイン認証機能作成だ

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0