2017-09-15 10 views
0

私は最近、チュートリアルを使ってDjangoベースの認証システムを構築しました。このシステムでは、私はform.py内にトークンを作成しました。このトークンは、アクティベーションアクティベーションメールで(リンクとして)送信されます。default_token_generatorはどのようにトークンを格納しますか?

from django.contrib.auth.tokens import default_token_generator  
token = default_token_generator.make_token(user) 

get要求を受けたビューは、トークンと一致し、ユーザIDは、このリンクに供給し、使用してトークンをチェックします。

default_token_generator.check_token(user, token) 

これは、トークンは、私のサイトかかわらず送信されたことを確認します。しかし、私はそのプロセスを理解していません。トークンはユニークですが、トークンをどこかに保存していないようですね。だからcheck_token()トークンを確認するにはどうすればいいですか?

答えて

2

トークンは、タイムスタンプとHMAC値で構成されます。 HMACは鍵付きハッシュ関数です。ハッシュでは秘密鍵(デフォルトではsettings.SECRET_KEY)を使用して一意の値を取得しますが、鍵の有無にかかわらず「解けない」ことは不可能です。

  • ユーザーのプライマリキー:

    ハッシュは四つの値を兼ね備えています。

  • ユーザーのハッシュパスワード。
  • ユーザーの最終ログインタイムスタンプ。
  • 現在のタイムスタンプ。

トークンは、現在のタイムスタンプとこれら4つの値のハッシュで構成されます。最初の3つの値はすでにデータベースにあり、4番目の値はトークンの一部であるため、Djangoはいつでもトークンを確認できます。

ユーザーのハッシュパスワードと最後のログインタイムスタンプをハッシュに含めることで、ユーザーがログインまたはパスワードを変更するとトークンが自動的に無効になります。現在のタイムスタンプもチェックされ、トークンが期限切れになっているかどうかが確認されます。現在のタイムスタンプがトークンに含まれていても(base36でエンコードされた文字列として)、攻撃者が値を変更するとハッシュも変更され、トークンは拒否されます。

+0

その有効性は、トークン自体から妥当性を計算できるので、それらを保存する必要はありません。 –

関連する問題