はじめに

django-allauth 65.18.0には、OpenID ConnectのIdentity Provider(IdP)機能で、IDP_OIDC_ID_TOKEN_EXPIRES_INを設定しても値が反映されず、IDトークンの有効期限が常にデフォルトの300秒として扱われる不具合があります。
この問題はdjango-allauth 65.19.0で修正されています。公式リリースノートにも、65.19.0のFixとして明記されています。
原因は複雑なOIDC処理ではありません。
65.18.0では、設定値を取得するための_setting()を呼び出さず、
return 5 * 60
と直接返していました。
つまり、設定ファイルに値を書いても、その設定を読む処理そのものが呼ばれていなかったことが原因です。
この記事の要点
django-allauth 65.18.0では
IDP_OIDC_ID_TOKEN_EXPIRES_INを設定してもIDトークン有効期限に反映されない。django-allauth 65.18.0ではIDトークン有効期限が常にデフォルトの300秒として扱われる。
原因は
ID_TOKEN_EXPIRES_INプロパティから設定取得処理_setting()が呼び出されていなかったことにある。django-allauth 65.19.0では
self._setting("ID_TOKEN_EXPIRES_IN", 5 * 60)へ修正された。この不具合はdjango-allauthをOIDC Identity Providerとして利用している環境が主な影響対象になる。
Googleログインなどdjango-allauthをOIDC/OAuthクライアントとして利用するだけの環境は、この不具合とは基本的に別である。
IDP_OIDC_ID_TOKEN_EXPIRES_INを未設定で300秒を使用している環境では、実際の動作に差が出ない。300秒より短い値を設定していた場合は、意図した時間よりIDトークンが長く有効になる可能性がある。
300秒より長い値を設定していた場合は、意図した時間より早くIDトークンが期限切れになる。
django-allauth 65.19.0は2026年8月6日に公開され、この不具合が公式に修正されている。
1. 結論:65.18.0でIdPを使っている場合は確認が必要
結論から言えば、django-allauth 65.18.0でOIDC IdP機能を利用し、IDP_OIDC_ID_TOKEN_EXPIRES_INをデフォルト値以外へ変更している環境は確認対象です。
公式ドキュメントでは、IDP_OIDC_ID_TOKEN_EXPIRES_INは「IDトークンが期限切れになるまでの時間を秒数で指定する設定」とされ、デフォルトは300秒です。
ところが65.18.0では設定値が参照されません。
例えば次のように設定していても、
IDP_OIDC_ID_TOKEN_EXPIRES_IN = 3600
期待値は、
3600秒
ですが、65.18.0では実際には、
300秒
として扱われます。
反対に、
IDP_OIDC_ID_TOKEN_EXPIRES_IN = 60
としていた場合でも、実際には300秒になります。
したがって影響は一方向ではありません。
| 設定値 | 期待する有効期限 | 65.18.0での実際 | 主な影響 |
|---|---|---|---|
| 未設定 | 300秒 | 300秒 | 実質的な差なし |
| 60 | 60秒 | 300秒 | 意図より長く有効 |
| 300 | 300秒 | 300秒 | 実質的な差なし |
| 900 | 900秒 | 300秒 | 意図より早く失効 |
| 3600 | 3600秒 | 300秒 | 意図より早く失効 |
django-allauth 65.19.0では、この問題が公式に修正されています。65.19.0は2026年8月6日に公開され、PyPIでも65.19.0が公開されています。
2. この記事で分かること
この記事では、次の点を確認できます。
django-allauth 65.18.0で何が起きるのか
自分のDjango環境が影響を受けるのか
OIDC、IdP、IDトークンとは何か
なぜ設定値が無視されるのか
65.18.0と65.19.0のコードの違い
実際の環境で不具合を確認する方法
65.19.0への安全な更新方法
更新後の動作確認方法
同種の設定不整合をCIで検出する方法
3. 対象読者・前提環境
主な対象読者は、次のようなDjango開発者・運用者です。
Djangoでdjango-allauthを使用している
OpenID Connectを使用している
django-allauthのIdP機能を使用している
django-allauth 65.18.0を使用している
認証・SSO基盤を運用している
バージョンアップ前に影響範囲を確認したい
特に重要なのが、django-allauthをどちら側で使っているかです。
【今回の主な影響対象】
ユーザー
↓
クライアントアプリ
↓ 認証要求
Django + django-allauth
↓
OIDC Identity Provider
↓
ID Token発行
django-allauth自身がIDトークンを発行する側である場合が対象です。
4. 用語と全体像――まずIdPとIDトークンを理解する
OIDCとは
OpenID Connect(OIDC)は、簡単に言えば、
「このユーザーが誰なのかを、別のシステムへ安全に伝えるための仕組み」
です。
OAuth 2.0を土台として、ユーザー認証に必要な仕組みを追加しています。
IdPとは
IdPはIdentity Providerの略です。
たとえるなら、身分証明書を発行する役所です。
利用者本人を認証し、
このユーザーは確かに○○さんです。
という情報をクライアントへ渡します。
django-allauthには通常のログイン機能だけでなく、OIDC Identity Providerとして動作する機能もあります。公式ドキュメントでもIdentity Provider → OpenID Connectとして独立した機能群が用意されています。
IDトークンとは
ID TokenはOIDCで利用される、ユーザー認証結果を表すトークンです。
一般的にはJWT形式で、
{
"iss": "https://example.com",
"sub": "12345",
"aud": "client-app",
"iat": 1786270000,
"exp": 1786270300
}
のような情報を持ちます。
重要なのが、
iat = 発行時刻
exp = 有効期限
です。
今回の不具合は、このexpを決める時間設定に関係します。
5. 何が起きたのか
【事実】
django-allauthの公式リリースノートでは、65.19.0のFixとして、
IDP_OIDC_ID_TOKEN_EXPIRES_INを設定しても常にデフォルト値を返していた問題を修正した
ことが明記されています。
65.18.0は2026年5月29日に公開されています。
65.19.0は2026年8月6日に公開されています。
つまり、
65.18.0
│
│ IDP_OIDC_ID_TOKEN_EXPIRES_IN
│ 設定を書いても参照されない
↓
常に300秒
│
│ 修正
↓
65.19.0
│
↓
settings.pyの値を正しく取得
という問題です。
6. 自分に関係するか
まず次の表で判断できます。
| 利用方法 | 影響 |
|---|---|
| django-allauth 65.18.0 + OIDC IdP | 要確認 |
65.18.0 + IDP_OIDC_ID_TOKEN_EXPIRES_IN変更済み | 影響あり |
| 65.18.0 + 設定未変更 | 動作差は基本的になし |
| Googleログインを利用 | この不具合の直接対象ではない |
| GitHubログインを利用 | この不具合の直接対象ではない |
| django-allauthをRP/OIDC Clientとしてだけ利用 | 基本的に対象外 |
| django-allauth 65.19.0 | 修正済み |
ここは誤解しやすいポイントです。
「OpenID Connectを使っている = 必ず影響する」ではありません。
GoogleなどをIdPとしてDjango側がログインを受け付ける構成と、Django自身がIdPになる構成は別です。
今回問題になっている設定名は、
IDP_OIDC_ID_TOKEN_EXPIRES_IN
です。
先頭がIDP_OIDC_であることからも、django-allauthのIdentity Provider側の設定であることが分かります。
7. 原因――設定を読む関数そのものが呼ばれていなかった
今回のポイントです。
65.18.0の実装
65.18.0では次の実装でした。
@property
def ID_TOKEN_EXPIRES_IN(self) -> int:
return 5 * 60
5 * 60なので、
300秒
です。
ここにはDjangoのsettingsを読む処理がありません。
他の設定はどうなっていたのか
例えば同じクラスのAccess Token設定では、
@property
def ACCESS_TOKEN_EXPIRES_IN(self) -> int:
return self._setting("ACCESS_TOKEN_EXPIRES_IN", 3600)
という形で、self._setting()を呼び出します。
考え方は、
settings.py
↓
IDP_OIDC_ACCESS_TOKEN_EXPIRES_IN
↓
_setting()
↓
AppSettings
↓
実際の処理
です。
ところが65.18.0のID Tokenだけは、
settings.py
↓
× 読まれない
AppSettings
↓
5 * 60
↓
300秒固定
となっていました。
65.19.0ではどう直ったのか
65.19.0では次のように変更されています。
@property
def ID_TOKEN_EXPIRES_IN(self) -> int:
return self._setting("ID_TOKEN_EXPIRES_IN", 5 * 60)
つまり、
@property
def ID_TOKEN_EXPIRES_IN(self) -> int:
- return 5 * 60
+ return self._setting("ID_TOKEN_EXPIRES_IN", 5 * 60)
という非常に小さな修正です。
しかし意味は大きく異なります。
65.18.0
300を返す
65.19.0
IDP_OIDC_ID_TOKEN_EXPIRES_INがあればその値
↓
なければ300
となります。
したがって今回の不具合は、厳密にはPythonの「引数順序不整合」や「関数シグネチャ不一致」ではありません。
設定値を取得するアクセサ_setting()の呼出し漏れによる設定参照不整合
と表現するのが正確です。
8. IDトークンにはどう影響するのか
django-allauthのOIDC実装では、IDトークンのexpを、
id_token["exp"] = (
id_token["iat"] + app_settings.ID_TOKEN_EXPIRES_IN
)
という考え方で決定します。
つまり、
発行時刻 iat
+
ID_TOKEN_EXPIRES_IN
=
有効期限 exp
です。
65.18.0でID_TOKEN_EXPIRES_INが300固定になれば、IDトークンの有効期限も設定値ではなく300秒を基準に計算されます。
9. セキュリティ上の問題なのか
ここは慎重に区別する必要があります。
【事実】
65.19.0の公式リリースノートでは、この問題はSecurity noticeではなくFixesに掲載されています。
2026年8月9日時点で、この問題についてCVE番号が割り当てられたことは確認できません。
GitHubのdjango-allauth Securityページにも公開Security Advisoryは掲載されていません。
したがって、
django-allauth 65.18.0に重大な認証脆弱性がある
と断定するのは適切ではありません。
ただし設定内容によってはセキュリティポリシーへ影響する
例えば、
IDP_OIDC_ID_TOKEN_EXPIRES_IN = 60
として、
IDトークンは1分で失効させる
というポリシーを設定していたとします。
65.18.0では実際には300秒になります。
期待
60秒
│
└────────────┐
↓
実際
300秒
つまり意図より240秒長くなります。
【一般論】
トークンの有効期限を短く設定する設計では、トークン漏えい時に利用可能な時間を短縮する狙いがあります。
そのため、設定した有効期限より長くトークンが有効になることは、認証ポリシーとの不整合につながる可能性があります。
一方、
IDP_OIDC_ID_TOKEN_EXPIRES_IN = 3600
だった場合は300秒で切れるため、主な影響は可用性や再認証頻度の増加になります。
10. 確認方法1――django-allauthのバージョンを確認する
目的
現在の環境が65.18.0か確認します。
実行場所
Djangoアプリケーションを動かしているPython仮想環境、Dockerコンテナ、またはアプリケーションサーバー上で実行します。
python -m pip show django-allauth
影響確認が必要な例
Name: django-allauth
Version: 65.18.0
修正済みの例
Name: django-allauth
Version: 65.19.0
判断
65.18.0
↓
次の確認へ
65.19.0以上
↓
今回の不具合は修正済み
なお、65.19.0は2026年8月6日にPyPIへ公開されています。
11. 確認方法2――設定値とallauth内部値を比較する
こちらの方法が最も分かりやすいです。
例えばsettings.pyへ、
IDP_OIDC_ID_TOKEN_EXPIRES_IN = 900
を設定しているとします。
目的
Django設定値と、django-allauthが実際に参照している値を比較します。
実行場所
Djangoプロジェクトのmanage.pyが存在するディレクトリです。
python manage.py shell -c "from django.conf import settings; from allauth.idp.oidc import app_settings; print('Django settings =', getattr(settings, 'IDP_OIDC_ID_TOKEN_EXPIRES_IN', '<not set>')); print('allauth =', app_settings.ID_TOKEN_EXPIRES_IN)"
65.19.0で900を設定した正常例
Django settings = 900
allauth = 900
65.18.0で発生する異常例
Django settings = 900
allauth = 300
判断方法
設定値 == allauth値
↓
正常
設定値 != allauth値
↓
設定参照不整合
注意:設定未指定の場合
次の結果だった場合、
Django settings = <not set>
allauth = 300
これは異常ではありません。
公式ドキュメント上もデフォルト値は300秒です。
したがって、
allauth = 300
という結果だけを見て、
65.18.0のバグが発生している
とは判断できません。
デフォルト値以外を設定しているのに300になることが重要です。
12. 対処方法――65.19.0以降へ更新する
この不具合の正式な修正は65.19.0に含まれています。
そのため、基本的な対処は65.19.0以降へのアップデートです。
更新前の注意
本番環境へ直接、
pip install -U django-allauth
を実行する方法は推奨しません。
依存関係の変更によって別の機能へ影響する可能性があります。
最低でも次を保存します。
python -m pip freeze > requirements-before-allauth-update.txt
さらに、Gitで依存関係ファイルを管理している場合は、更新前の状態をコミットまたはタグとして残します。
データベースを利用する本番システムでは、通常のデプロイ手順に従ってバックアップも確認してください。
requirements.txtの場合
例えば、
django-allauth==65.18.0
を、
django-allauth==65.19.0
へ変更します。
その後、検証環境で、
python -m pip install -r requirements.txt
を実行します。
PyPIでは65.19.0のwheelおよびsource distributionが2026年8月6日に公開されています。
13. 動作確認
アップデートしただけで完了にはしません。
先ほどのコマンドをもう一度実行します。
python manage.py shell -c "from django.conf import settings; from allauth.idp.oidc import app_settings; print('Django settings =', getattr(settings, 'IDP_OIDC_ID_TOKEN_EXPIRES_IN', '<not set>')); print('allauth =', app_settings.ID_TOKEN_EXPIRES_IN)"
例えば、
IDP_OIDC_ID_TOKEN_EXPIRES_IN = 900
なら、
Django settings = 900
allauth = 900
になれば設定参照部分は正常です。
さらにOIDC IdPを実際に使用している場合は、検証用クライアントから認証を行い、発行されたIDトークンの、
exp - iat
も確認します。
900秒設定なら概ね、
exp - iat = 900
になることを確認します。
本番トークンを外部JWT解析サイトへ貼り付けない
IDトークンにはユーザーを識別できる情報などが含まれる場合があります。
本番環境のトークンを、確認のために第三者のJWT解析Webサービスへ貼り付けることは避けます。
必要ならローカル環境で解析します。
14. 再発防止――設定値を「書いた」だけで安心しない
今回の不具合から得られる重要な教訓があります。
settings.pyへ設定した
│
↓
設定できたはず
では不十分です。
実際には、
settings.py
↓
設定アクセサ
↓
ライブラリ内部
↓
トークン生成
↓
実際の出力
まで確認する必要があります。
テストで設定反映を確認する
例えばプロジェクト側で次のようなテストを用意できます。
from django.test import SimpleTestCase, override_settings
class OIDCSettingsTest(SimpleTestCase):
@override_settings(
IDP_OIDC_ID_TOKEN_EXPIRES_IN=900
)
def test_id_token_expiration_setting(self):
from allauth.idp.oidc import app_settings
self.assertEqual(
app_settings.ID_TOKEN_EXPIRES_IN,
900,
)
このテストで確認したいのは、
設定ファイルへ900を書いた
ことではありません。
allauth内部から900として取得できる
ことです。
こうしたテストをCIへ入れておけば、ライブラリ更新時の設定不整合を検出しやすくなります。
15. WAF・IPS・EDRで防げる問題ではない
今回の問題は外部から送信された悪意あるHTTPリクエストによって発生するタイプの問題ではありません。
攻撃者
↓
WAF
↓
Webアプリ
という境界ではなく、
settings.py
↓
django-allauth設定アクセサ
↓
OIDC処理
というアプリケーション内部の設定処理にあります。
そのため、
WAF
IPS
IDS
EDR
で根本的に防ぐ種類の問題ではありません。
重要なのは、
依存ライブラリのバージョン管理
+
リリースノート監視
+
設定値の自動テスト
+
OIDC統合テスト
です。
16. 注意点・よくある誤解
誤解1:django-allauth 65.18.0なら全ユーザーに影響する
違います。
今回の問題はOIDC IdP用の、
IDP_OIDC_ID_TOKEN_EXPIRES_IN
に関係します。
通常のログイン機能だけを使っているサイトまで一律に影響すると考える必要はありません。
誤解2:Googleログインを使っているから対象になる
必ずしも対象ではありません。
GoogleをIdentity ProviderとしてDjangoがログインを受け取る構成と、django-allauth自身をIdentity Providerとして動かす構成は違います。
誤解3:300秒と表示されたらバグである
違います。
公式のデフォルト値自体が300秒です。
設定していない場合に300秒になるのは正常です。
誤解4:重大なCVEである
2026年8月9日時点で、そのような事実は確認できません。
公式リリースノートでもSecurity noticeではなくFixesとして扱われています。
CVE番号も確認できません。
そのため、根拠なく「重大な認証脆弱性」と表現することは避けるべきです。
17. まとめ
django-allauth 65.18.0には、OIDC Identity Provider用設定、
IDP_OIDC_ID_TOKEN_EXPIRES_IN
が反映されない不具合があります。
原因は65.18.0の実装で、
return 5 * 60
とデフォルト値を直接返していたためです。
65.19.0では、
return self._setting(
"ID_TOKEN_EXPIRES_IN",
5 * 60,
)
へ修正されています。
したがって確認手順はシンプルです。
django-allauthのバージョン確認
↓
65.18.0か?
↓ YES
IDP OIDCを使用しているか?
↓ YES
IDP_OIDC_ID_TOKEN_EXPIRES_INを変更しているか?
↓ YES
設定値とapp_settingsを比較
↓
300固定なら影響あり
↓
65.19.0以降へ更新
↓
再確認
↓
OIDC統合テスト
設定ファイルに正しい値が書かれていても、ライブラリがその値を読み取っているとは限りません。
今回の不具合は、「設定値そのもの」だけではなく「設定が実際の処理まで届いているか」をテストする重要性がよく分かる事例です。
18. FAQ
Q1. django-allauth 65.18.0を使っていたら必ずアップデートする必要がありますか?
今回の不具合だけで判断する場合、OIDC IdP機能を使用していなければ直接的な影響は限定的です。
ただし65.19.0にはこの修正以外の変更も含まれるため、公式リリースノートを確認した上で通常の依存ライブラリ更新計画に組み込むことを推奨します。
Q2. IDP_OIDC_ID_TOKEN_EXPIRES_INを設定していません。影響しますか?
デフォルトは300秒です。
65.18.0も300秒を返すため、この設定に限って見れば実際の結果に差はありません。
Q3. 60秒を設定していました。
65.18.0では300秒になるため、意図した値より長くなります。
更新を優先して確認すべきケースです。
Q4. 3600秒を設定していました。
65.18.0では300秒になるため、意図より早くIDトークンが期限切れになります。
再認証やクライアント側の認証処理へ影響していなかったか確認します。
Q5. Access Tokenも300秒固定になりますか?
今回公式に修正された問題はIDP_OIDC_ID_TOKEN_EXPIRES_INです。
65.18.0のACCESS_TOKEN_EXPIRES_INは_setting()を使用して設定を取得する実装になっています。
そのため、今回と同じ原因によるAccess Token設定の固定化とは分けて考える必要があります。
Q6. WAFで対策できますか?
できません。
外部リクエストを検査する問題ではなく、ライブラリ内部の設定参照処理の問題です。
Q7. CVEはありますか?
2026年8月9日時点で、この不具合に対応するCVEは確認できません。
公式リリースノートではSecurity noticeではなくFixesに分類されています。
19. 参考情報
django-allauth公式「65.19.0 Release Notes」――65.19.0は2026年8月6日公開。
IDP_OIDC_ID_TOKEN_EXPIRES_INが設定されていてもデフォルト値を返していた問題の修正が明記されている。django-allauth公式「OpenID Connect / Configuration」――
IDP_OIDC_ID_TOKEN_EXPIRES_INのデフォルト値は300秒で、IDトークンの有効期間を秒単位で設定する項目。django-allauth 65.18.0ソースコード
allauth/idp/oidc/app_settings.py――ID_TOKEN_EXPIRES_INが5 * 60を直接返す実装。65.18.0では
ID_TOKEN_EXPIRES_INが次のように実装されています。@property def ID_TOKEN_EXPIRES_IN(self) -> int: return 5 * 60つまり
settings.pyを読むself._setting()を通さず、300秒を直接返しています。django-allauth 65.19.0ソースコード
allauth/idp/oidc/app_settings.py――self._setting("ID_TOKEN_EXPIRES_IN", 5 * 60)へ変更。5.19.0では次のように変更されています。
@property def ID_TOKEN_EXPIRES_IN(self) -> int: return self._setting("ID_TOKEN_EXPIRES_IN", 5 * 60)この修正によって、
IDP_OIDC_ID_TOKEN_EXPIRES_IN ↓ _setting() ↓ 指定した設定値という本来の設定取得経路が復旧しています。
コメント(0件)
まだコメントはありません。最初のコメントを投稿してください!