1.初めに
DjangoとReactでSPAを作るんだったら認証まわりどうなってるんだろうと思って調べてみたら先達の方々は自分で実装するよりも外部サービスを経由する方がセキュリティ的に安全と結論づけていました。その中でも特にメジャーな方法としてJWT(Json Web Token)を使ったやり方がより多くの情報が出回っているようでした。
そこで、私もこちらのサイトを参考にして実装しようとしましたが、Django4のリリースに伴い、既存のやり方ではうまくいかないことが判明しましたので今回記事を執筆しようと考えました。
2.前提環境
- OS:Mac, Linux
- Python3.9
- virtualenv
3.Django4ではurl関数が削除されたらしい
DjangoのバージョンにこだわらずDjango4を仮想環境に入れた上でこちらのサイトの説明に沿って初期設定を進めて行き、マイグレーションを実行しようとしました所、ターミナルでurlがねーよと怒られました。
エラー文について調査をしましたところ、Django4ではdjango.conf.urlsのurl関数が削除されたらしいです。代わりに、urls.pyを下記のように
from django.urls import path
と記述し、urlpatterns = []内のurl関数を使用している箇所をすべてpath関数に変更したところマイグレーション、スーパーユーザー作成、サーバー起動のすべてのコマンドが正常に動きましたが、405エラーが返されてしまいました。本来だったら紹介しているサイト通りに構築を進めれば
こういう画面になるわけですが、405エラーが返される原因や対処法については私にはさっぱりでした。ここについては今後調べてみようと思います。でも、ここさえ解決できればDjango4とJWTで認証を構築する事も難しくはないと思います。少なくともサーバーサイドでのエラーはないというわけですから。
4.結論
構築時にDjango3を指定しましょう
Django3をサーバーサイドに指定すれば問題なく動きます。参考にしたサイトでは構築の流れとして
$ mkdir backend/ && cd backend/
$ python3.6 -m venv env
$ source env/bin/activate
$ pip install coreapi django djangorestframework \ djangorestframework-simplejwt
$ pip freeze > requirements.txt
$ django-admin startproject config .
と説明していますが、このやり方ですと最新バージョンのDjango4が入ってしまいます。仮想環境に入るDjangoのバージョンを指定してやる必要がありますので、これらのコマンドの一部を下記のように修正します。
$ mkdir backend/ && cd backend/
$ python3.6 -m venv env
$ source env/bin/activate
$ pip install coreapi django==3.1.14 djangorestframework pyyaml \ djangorestframework-simplejwt
$ pip freeze > requirements.txt
$ django-admin startproject config .
Djangoインストール時にこのようにDjango3のリリース済みのバージョンを3系で適当に指定しておきます。また、pyyamlのインストールもするようにコマンドを修正しました。pyyamlを追加しておかないとlocalhost:8000/apiにアクセスした際にpyyamlがねーよと怒られます。
localhost:8000/apiにアクセスし、右上のlog inをクリックしてスーパーユーザー作成時に設定したユーザー名とパスワードを入力し、ログインに成功するのを確認できたらOKです。
以上です。あとはこちらのサイトの説明通りにconfig直下のsettings.pyやurls.pyを書き換えてやれば問題なく処理は動いてくれます。
Django4でSPA実装する際の認証周り誰かやり方教えてくれないかなあ…。