課題
Keycloak x django-allauthでOIDCの認証を検証して時に、以下のような認証エラー画面が表示された。

OIDCのフローの赤枠で囲った部分(=Keycloakのログインには成功してリダイレクトでDjangoのredirect_uriにコールバックされてきたところ)で発生している。

https://infosec.mozilla.org/guidelines/iam/openid_connect.html#detailed-oidc-authentication-flow
画面からは「ログインに失敗した」ということしか読み取れず、ログも出力されていない。
結論
templates/socialaccount/authentication_error.htmlをオーバーライドして、テンプレート上でauth_errorを出力するとエラーの詳細を画面に出力できた。- → ドメインが合っておらずトークンリクエスト(=OIDCの次のフロー)に失敗していたということが分かった

手順
1. settings.pyにテンプレート検索対象のディレクトリを追加
公式ドキュメントにdjango-allauthのテンプレートのオーバーライド方法の説明があるので、その通りにやる。
https://docs.allauth.org/en/dev/common/templates.html#overriding-the-built-in-templates
settings.py
TEMPLATES = [
{
# 省略
"DIRS": [
BASE_DIR / "templates"
],
# 省略
},
]
2. オーバライド用のテンプレートを作成
- Gitリポジトリのroot直下に
templates/socialaccount/を作成 templates/socialaccount/配下にauthentication_error.htmlを配置
3. テンプレートをオーバーライド
- 元の https://github.com/pennersr/django-allauth/blob/main/allauth/templates/socialaccount/authentication_error.html の中身をコピる。
{{ auth_error }}を追加
templates/socialaccount/authentication_error.html
{# 省略 #}
{% block content %}
{# 省略 #}
{{ auth_error }}
{% endblock content %}
理由
- ソースコードを読むと、
auth_errorという変数名でエラーコードや例外自体はテンプレートに渡していそうだということが分かった。 - 今回のエラーで使用されていたテンプレートは以下なので、これをオーバーライドして変数をダンプするとよさそうと思った