PHP Email Verification
概要:このチュートリアルでは、アクティベーションリンクを使用して、新しいアカウントのメールアドレスを安全に検証する方法を学
新しいアカウントのPHPメール検証の概要
前のチュートリアルでは、ユーザーがアカウントを登録できる登録フォームを作成する方法を学びました。 また、ユーザーがユーザー名とパスワードを使用してサインインできるようにするログインフォームを作成する方法も学びました。
ユーザーが新しいアカウントに登録すると、メールアドレスを入力します。 ただし、システムは電子メールを検証しないため、ユーザーは任意の電子メールアドレスを入力できます。
ユーザーのメールアドレスを確認するには、これらのメールアドレスに確認メールを送信し、ユーザーにメールを開き、アクティベーションリンクをクリックするよう
これを行うには、ユーザーがアカウントを登録するときに次の手順に従います:
- 一意のアクティベーションコードを生成し、有効期限を設定します。
- ユーザーレコードをデータベースに保存し、ユーザーのステータスを非アクティブとしてマークします。 また、アクティベーションコード&の有効期限のハッシュを保存します。
- ユーザーのメールアドレスにアクティベーションリンクを記載したメールを送信します。 アクティベーションリンクには、電子メールアドレスとアクティベーションコードが含まれます。,
https://app.com/activate.php?email=email&activation_code=abcd
- 電子メールを介してアカウントを有効にするようにユーザーに通知します。
アクティベーションコードをハッシュすると、メールアドレスを所有するユーザーのみがアカウントをアクティベートでき、データベースにアクセスできる管理者でさえ、他の誰もアクティベートできないようになります。
ユーザーがアカウントを有効にしていない場合、ログインできません。
ユーザーが電子メール内のアクティベーションリンクをクリックすると、次の手順を実行する必要があります:
- 電子メールとアクティベーションコードをサニタイズして検証します。
- メールアドレスを持つ非アクティブなユーザーを検索します。 ユーザーレコードが存在しない場合は、登録フォームにリダイレクトします。
- ユーザーレコードが存在し、アクティベーションコードの有効期限が切れている場合は、データベースからユーザーレコードを削除し、登録フォームにリダイレクトします。
- それ以外の場合は、アクティベーションコードをデータベースに格納されているアクティベーションコードのハッシュと一致させます。 一致する場合は、ユーザーレコードをアクティブとしてマークし、ログインページにリダイレ
usersテーブルの再作成
まず、auth
データベースからusers
テーブルを削除します:
Code language: SQL (Structured Query Language) (sql)
次に、新しい列を持つusers
テーブルを作成しますactive
, activation_code
, activation_at
, activation_expiry
:
Code language: SQL (Structured Query Language) (sql)
以下では、新しい列の意味を説明します。
active
列の値はデフォルトで0になります。 つまり、アカウントに登録してもメールアドレスを確認していないユーザーは、デフォルトで無効になります。
activation_code
列にはアクティベーションコードのハッシュが格納されます。 その長さは、password_hash()
関数によって返された文字列を格納するのに十分でなければなりません。
activation_code
列に十分な長さのサイズがない場合、ハッシュが切り捨てられることに注意することが重要です。 これにより、password_verify()
関数がアクティベーションコードとハッシュとの一致に失敗します。
activation_expiry
列には、有効期限の前にアクティベーションコードを使用するための有効期限が格納されます。 有効期限は、有効期限後に電子メールアドレスが侵害された場合、アクティベーションコードを使用できないことを保証します。
activated_at
列には、ユーザーがアカウントをアクティブ化した日付と時刻が格納されます。
プロジェクト構造
メール検証機能を追加する前に、現在のプロジェクト構造を確認してみましょう:
Code language: PHP (php)
authの関数を変更します。phpファイル
以下では、アクティベーションコードと有効期限パラメータをregister_user()
関数に追加します。 デフォルトでは、有効期限は1日(1 * 24 * 60 * 60
)です。
Code language: PHP (php)
register_user()
関数はpassword_hash()
関数を使用してアクティベーションコードをハッシュします。
find_user_by_username()
関数には、結果にactive
列が含まれます:
Code language: PHP (php)
次の例では、ユーザーがアクティブな場合にtrueを返す新しい関数is_user_active()
を定義しています:
Code language: PHP (php)
login()
関数では、アクティブなユーザーのみがサインインできるようにする必要があります:
Code language: PHP (php)
電子メール検証を扱う関数の定義
電子メール検証を扱う関数をauth.php
ファイルに追加します。
まず、config
フォルダに新しいファイルapp.php
を作成し、次の定数を定義します:
Code language: PHP (php)
これらの定数を使用して、ユーザーにアクティベーションメールを送信します。 これらの定数を使用するには、app.php
ファイルをbootstrap.php
ファイルに含める必要があります:
Code language: PHP (php)
次に、一意にランダムなアクティベーションコードを生成する関数を定義します:
Code language: PHP (php)
第三に、アクティベーションリンクを含む電子メール検証を送信する関数を定義します。
Code language: PHP (php)
アプリのURLがhttp://localhost/auth
であると仮定すると、アクティベーションURLは次のようになります:
Code language: PHP (php)
send_activation_email()
関数は、電子メールを送信するための組み込みのmail()
関数を使用します。
第四に、idとステータスによってユーザーを削除する関数を定義します。 デフォルトでは、非アクティブなユーザーをidで削除します。
Code language: PHP (php)
第五に、電子メールとアクティベーションコードで未検証のユーザーを見つける関数を定義します。 アクティベーションコードの有効期限が切れている場合、関数はdelete_user_by_id()
関数を呼び出してユーザーレコードも削除します。
Code language: PHP (php)
第六に、idによってユーザーをアクティブ化する新しいactivate_user()
関数を定義します:
Code language: PHP (php)
レジスタを変更します。phpページ
src/register.php
は、電子メール検証ロジックを処理するためのロジックを組み込む必要があります。
Code language: PHP (php)
それはどのように動作します。
まず、アクティベーションコードを生成します:
Code language: PHP (php)
次に、アクティベーションコードをユーザーに登録します:
Code language: PHP (php)
第三に、send_activation_email()
関数を呼び出して、ユーザーのメールアドレスに電子メールを送信します:
Code language: PHP (php)
最後に、ユーザーをログインページにリダイレクトし、ユーザーに電子メールでアカウントを有効にするように要求するflashメッセージを表示します:
Code language: PHP (php)
アクティブ化を作成します。php page
ユーザーが登録後にアカウントをアクティブ化できるようにするには、public
フォルダに新しいactivate.php
ページを作成し、次のページを使用します:
Code language: PHP (php)
どのように活性化します。phpは動作します。
まず、電子メールとアクティベーションコードをサニタイズして検証します:
Code language: PHP (php)
次に、検証エラーがない場合は、電子メールと検証コードに基づいて未検証のユーザーを検索します。 また、find_unverified_user()
は、有効期限が切れている場合、未検証のユーザーも削除します。
Code language: PHP (php)
第三に、ユーザーをアクティブ化し、ログインにリダイレクトします。phpページ:
Code language: PHP (php)
最後に、エラーがある場合はregistration.php
にリダイレクトします:
Code language: PHP (php)
このチュートリアルでは、PHPでユーザーアカウントの電子メール検証を実装する方法を学習しました。
Leave a Reply