[備忘メモ]Djangoの認証周りのカスタマイズ

こんばんは、クロです。
疲れたのでお休みしようと思いましたが意地で書きます。

毎度おなじみ前置き

SEからWebエンジニアに転職したら全くわからないことだらけで、毎日知らない言葉が出てくる…
ので後から見た時に「当時自分が何で困っていたのか」を振り返れるようにすることが目的です。
詳しく調べて書く時間はないので、大体30分以内に書ききれるレベルの内容にしていきたいです。

…これを見ても答えは書いてないので技術情報探している方は他の記事を見た方がためになると思います。

出てきた場面

ログイン用のAPI作って認証エラーが出て色々調べて解決したけど本質的に理解できてない。
将来的には認証機能を拡張する可能性もあるので理解を深めたい。
allauthとかrest-authとかいろいろプラグインあるけど何が違ってどう使うのか。

ざっくりした理解

・djangoには標準で認証機能がある
 →標準ではUser/Passwordが認証のキー
 →カスタマイズしたい場合はAUTHENTICATION_BACKENDSで指定された認証を行う
・外部の認証を使用したい場合はプラグインを使う
 →その場合も上記カスタマイズと同様に差し込む
・使い方は公式リファレンスを読めば良さそう(未読)

下記の記述で結構腑に落ちた。

標準では username/password によるログインが有効になっていますが、ここでは試しに email/password によるログインもできるようにしてみましょう。Djangoでは認証バックエンドというクラスを用意してあげれば認証処理を自由に拡張することができます。 django.contrib.auth.authenticate() が呼ばれると、 settings.py の AUTHENTICATION_BACKENDS により指定される認証バックエンドのリストの先頭から順に認証を試みます。1つが失敗しても次の認証バックエンドで認証を試み、全て認証に失敗すると認証失敗となります 1。

それではEメールとパスワードで認証を行う認証バックエンドを定義して、 AUTHENTICATION_BACKENDS に追加してみましょう。 デフォルトでは、 認証バックエンドは2つのメソッドを定義しなければなりません 2。

authenticate(request, **credentials): HttpRequestオブジェクトとあわせて認証に必要な情報を受け取り、ユーザーモデルのオブジェクトを返す。
get_user(user_id): ユーザーモデルの主キーを受け取り、ユーザーモデルのオブジェクトを返す。

引用元:Django における認証処理実装パターン

参考リンク

Djangoフレームワークのユーザーモデルと認証
Django REST Frameworkでユーザ認証周りのAPIを作る
Django REST framework JWTを使ったwebAPI経由のログイン認証動作確認をPythonで実装する
django-rest-auth
django-allauthでログイン機能を実装する