Django REST Frameworkを使って、WebAPIの認証をJWTにしたとき備忘録。
インストール
$ pip install django djangorestframework djangorestframework-jwt
全体の設定
settings.pyに設定を追加
REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': ( 'rest_framework.permissions.IsAuthenticated', ), 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework_jwt.authentication.JSONWebTokenAuthentication', ), 'NON_FIELD_ERRORS_KEY': 'detail', 'TEST_REQUEST_DEFAULT_FORMAT': 'json' }
トークンの払い出しの設定
urls.pyにobtain_jwt_token
のパスを追加
from rest_framework_jwt.views import obtain_jwt_token urlpatterns = [ path('jwt-token', obtain_jwt_token), ]
$ curl -i -s "http://localhost:8000/jwt-token"
トークンを使った認証の設定
viewにpermission_classesを設定すればOK
from rest_framework.generics import GenericAPIView from rest_framework.permissions import IsAuthenticated from rest_framework.response import Response from rest_framework import status class AuthViewSet(GenericAPIView): permission_classes = (IsAuthenticated,) def get(self, request, format=None): return Response(data={'username': request.user.username}, status=status.HTTP_200_OK)
from rest_framework_jwt.views import obtain_jwt_token from .views import AuthViewSet urlpatterns = [ path('jwt-token', obtain_jwt_token), path('auth', AuthViewSet.as_view()), ]
$ curl -i -s -H "Authorization: JWT <Token>" "http://localhost:8000/auth"
手動でトークンを生成する
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)
Apacheへのデプロイ時の注意
Authorizationヘッダを利用する場合、WSGIに追加の設定が必要!
#jwt_auth_enable WSGIPassAuthorization On #←ここの一行を加える!
参考になる書籍
- 作者: 関根裕紀,新井正貴
- 出版社/メーカー: シーアンドアール研究所
- 発売日: 2019/07/01
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
- 作者: 掌田津耶乃
- 出版社/メーカー: 秀和システム
- 発売日: 2018/06/09
- メディア: 単行本
- この商品を含むブログを見る
- 作者: 横瀬明仁
- 出版社/メーカー: NextPublishing Authors Press
- 発売日: 2018/08/26
- メディア: オンデマンド (ペーパーバック)
- この商品を含むブログを見る
- 作者: 横瀬明仁
- 発売日: 2018/12/08
- メディア: Kindle版
- この商品を含むブログを見る
参考にしたサイト様
- Django REST framework JWT
- DjangoでJWTを使ったトークン認証を実装する - らっちゃいブログ
- django-rest-framework-jwtの認証をカスタマイズする方法 - らっちゃいブログ
- Django REST Frameworkでユーザ認証周りのAPIを作る
- Django REST framework JWTを使ったwebAPI経由のログイン認証動作確認をPythonで実装する - まわ
- python - Django Rest Framework - Authentication credentials were not provided - Stack Overflow
- GetBlimp/django-rest-framework-jwt: JSON Web Token Authentication support for Django REST Framework
- curl コマンド 使い方メモ