djangoのパスワードリセット機能でURLに付与されるtokenについて調べたメモ
djangoのパスワードリセット機能は、以下のようなURLを含むメールを送って、アクセスしたユーザーが新しいパスワードを入力するものです。
http://localhost:8000/auth/password_reset_confirm/2-3hw-4c194a11e6bda0c44f5c/
パスの最後のランダムな部分はそれぞれ以下のように算出されます。
- 2
user.pkのbase36表記
- 3hw
timestamp(2001/1/1からの経過日数)のbase36表記
- 4c194a11e6bda0c44f5c
user.pk, user.password, user.login_timestamp, timestampから生成した鍵付きハッシュ値
URLにアクセスされたときはまず「2」の部分から、ユーザーを取得し、次に取得したユーザーの情報と「3hw」をデコードして得たtimestampから「4c194a11e6bda0c44f5c」と同等のハッシュ値を生成できるかどうか確認します。
最後に「3hw」のtimestampから、urlの有効期間が過ぎていないかをチェックします。
以上から、urlが発行されたあとにログインしていたり、パスワードの変更が行われると、その場でURLが無効になることがわかります。
tokenのチェックがOKの場合は、パスワードの変更が可能になります。