はじめに
おにめつのじん! nikkieです。
過去に触ったdjoserの思い出しです。
目次
PyCon JP 2021 スタッフ活動の中で作ったDjangoアプリ
プロポーザルレビューアプリをDjangoで作りました。
レビュー機能はWebアプリとして作ったのですが、管理者用のデータ管理APIをDjango REST Frameworkで実装しています1。
akiyokoさんの『現場で使える Django REST Framework の教科書』にめちゃめちゃ助けていただきました。
データ管理APIは管理者しか扱えないよう、djoserを使って認証を実装しました2。
「ここってどうやったんだっけ」と思い出したく、今回手を動かしました。
djoserのSample usage
こちらに沿って進めていきます。
サンプルアプリを動かす
djoserのリポジトリにはサンプルアプリがあります。
まずはリポジトリをクローン
% git clone git@github.com:sunscrapers/djoser.git -b 2.2.2 % cd djoser
Python 3.11.8で仮想環境を作っています。
% pip install -e . % pip install 'webauthn<1'
annotated-types==0.6.0 asgiref==3.8.1 asn1crypto==1.5.1 cbor2==5.6.3 certifi==2024.2.2 cffi==1.16.0 charset-normalizer==3.3.2 cryptography==42.0.7 defusedxml==0.8.0rc2 Django==5.0.6 django-templated-mail==1.1.1 djangorestframework==3.15.1 djangorestframework-simplejwt==5.3.1 -e git+ssh://git@github.com/sunscrapers/djoser.git@5842524091a00ffbaecc667605da8135a8a60d0d#egg=djoser future==1.0.0 idna==3.7 oauthlib==3.2.2 pycparser==2.22 pydantic==2.7.1 pydantic_core==2.18.2 PyJWT==2.8.0 pyOpenSSL==24.1.0 python3-openid==3.2.0 requests==2.31.0 requests-oauthlib==2.0.0 six==1.16.0 social-auth-app-django==5.4.1 social-auth-core==4.5.4 sqlparse==0.5.0 typing_extensions==4.11.0 urllib3==2.2.1 webauthn==0.4.7
manage.pyを実行します。
% cd testproject % ./manage.py migrate % ./manage.py runserver 8088
models.W042
が出ていました(Djangoのバージョンアップの影響なのかな?)
Auto-created primary key used when not defining a primary key type, by default 'django.db.models.AutoField'.
HINT: Configure the DEFAULT_AUTO_FIELD setting or the AppConfig.default_auto_field attribute to point to a subclass of AutoField, e.g. 'django.db.models.BigAutoField'.
今回は無視して進めています
トークン認証を体験する
別のターミナルにて
ユーザを作りました
(curl
では--data
を指定したときPOSTになるので-X POST
は省略)
% curl http://127.0.0.1:8088/auth/users/ --data 'username=djoser&password=alpine12' {"email":"","username":"djoser","id":1}
APIを介してログインします。
認証に使うトークンが返ります
% curl http://127.0.0.1:8088/auth/token/login/ --data 'username=djoser&password=alpine12' {"auth_token":"0d0bca572490495255f1f626d96bfb61ffaba86a"}
% curl -L http://127.0.0.1:8088/auth/users/me/ -H 'Authorization: Token 0d0bca572490495255f1f626d96bfb61ffaba86a' {"email":"","id":1,"username":"djoser"}
ログアウト
% curl http://127.0.0.1:8088/auth/token/logout/ --data '0d0bca572490495255f1f626d96bfb61ffaba86a' -H 'Authorization: Token 0d0bca572490495255f1f626d96bfb61ffaba86a'
トークンが使えなくなりました。
% curl -L http://127.0.0.1:8088/auth/users/me/ -H 'Authorization: Token 0d0bca572490495255f1f626d96bfb61ffaba86a' {"detail":"Invalid token."}
サンプルアプリの設定を見る
プロジェクトのurls.pyを見ると、色々有効になっています。
https://github.com/sunscrapers/djoser/blob/2.2.2/testproject/urls.py
djoser.social.urls
なども有効になっているっぽい!
settingsを見ると
https://github.com/sunscrapers/djoser/blob/2.2.2/testproject/settings.py
INSTALLED_APPS
に"social_django"
AUTHENTICATION_BACKENDS
にFacebook、Google、Steamの指定- これらの設定値(例:
SOCIAL_AUTH_FACEBOOK_KEY
)
- これらの設定値(例:
と、ソーシャルログインも設定できる雰囲気です(宿題事項)
終わりに
過去に使ったdjoserの思い出しでした。
用意されていたサンプルアプリを動かしました。
トークン認証を思い出せました!