概要
以下の記事などでKeycloak x django-allauthでの基本的なOIDC認証は検証できた。
今回はOIDCで推奨されているセキュリティ対策の仕組みであるPKCEを追加してみる。
PKCE自体については巷に以下のような解説記事がたくさんあるのでここでは触れない。
Keycloak側の設定
Keycloak側は管理画面のメニューからClients -> 対象のクライアントを選択 -> Advanced -> Advanced settingsと遷移するとPKCEの設定があるセクションにたどり着ける。
「Proof Key for Code Exchange Code Challenge Method」というのが設定項目っぽい。
S256とplainが選べるが、デフォルトでは未選択になっている。

未選択の場合、PKCEは適用されないらしい。

S256を選択して保存する。
Django側の設定
まず何もせずにdjango-allauthでKeycloakのOIDC認証を試みる。これまでは認証が成功していたのに、以下のようにエラーが返されるようになった。

→ django-allauth側でPKCE対応の設定をしていないからと考えられる。
公式ドキュメントによると、settings.pyに"OAUTH_PKCE_ENABLED": Trueの1行を追加するだけでいいらしい。
settings.py
# ...省略 SOCIALACCOUNT_PROVIDERS = { "openid_connect": { "OAUTH_PKCE_ENABLED": True, # 追加 "APPS": [ { "provider_id": "keycloak", # ...省略 } ] } } # ...省略
https://docs.allauth.org/en/dev/socialaccount/providers/openid_connect.html
設定を追加したら、以下のようにログイン画面にアクセスできるようになった。PKCE特有のパラメータであるcode_challenge_methodとcode_challengeもちゃんと付与されている。

→ ID/パスワードを入力したら認証も成功した。
以上でKeycloak x django-allauthのOIDC認証にPKCEを追加することに成功した。