新しいユーザーにメールの確認を要求するアプリケーションを実装する必要があるとしましょう。新規ユーザーが登録すると、確認キーを含むメールがユーザーのメールアドレスに送信されます。キーを消費すると登録が完了します。
確認キーは登録時に生成され(そしてユーザー/電子メールに関連付けられ)、データベースのテーブルに保存されます。問題は、ユーザーが確認キーを消費したときに、データベース内の対応するエントリを削除する必要があるか(つまり、そのようなエントリがない場合はユーザーが確認されたことを示す)、またはテーブルに追加の列があるかどうかです(例:「確認済み」)ユーザーが確認済みかどうかを示しますか?
これをデータベースに実装する正しい方法も間違った方法もありません。それはすべてあなたのニーズに依存します。
通常、電子メールによる登録確認は、ユーザーの電子メールアドレスを検証するために行われます。マーケティング部門は、マーケティングキャンペーンを送信するときに、それらのキャンペーンが実際に誰かの受信トレイに到達することを確認したいと考えています:)。メールを検証する他の理由は、ユーザーがパスワードを忘れた場合に、リセットトークンを送信できるチャネルがあることを確認することです。
登録キーがユーザーの電子メールを検証するためだけに使用される場合は、どこかに保存する必要はなく、ユーザーのデータから生成するだけです。
a = user id in the database;
b = user email;
c = timestamp of registration;
d = number of hours (or days) that the confirmation key is valid;
e = any other unique things of the user
confirmationKey = sha1(concat(a, b, c, d, e))
次に、この確認キーをメールでユーザーに送信し、ユーザーが返信したときにハッシュを再生成して、ユーザーが送信したものと照合します。ハッシュが一致する場合は、ユーザーが登録を確認した時間がc + d
より短いかどうかを確認します。はいの場合、トークンは有効であり、まだ有効期限が切れていません。もちろん、確認キーが誰にも推測されないようにする必要があり、c
のようなフィールドはその意味で役立ちます。あなたはアイデアを得る...
次のような登録プロセスに関する質問に答える必要がない限り、データベースに何も保存する必要はありません。
回答する必要がある質問(ある場合)を見つけたら、データベースに何を保存する必要があるか、またその方法もわかります。
ユーザーが登録しない場合は、確認キーを一時的にして、一定時間後に期限切れにすることをお勧めします。確認キーと、ユーザーテーブル内の対応するユーザーへのリンクを含む別のテーブルが必要です。ユーザーテーブルには、確認ステータスを示すフィールドがあります。ユーザーが正常に登録された場合は、ユーザーテーブルにフラグを設定し、確認キーテーブルの対応するレコードを削除します。確認キーの有効期限が切れている場合は、その時点で削除する必要があります。