今回はPHPでパスワードリセット機能実装編です。
パスワードリセット機能を実装することは、ウェブサイトやアプリケーションのセキュリティを向上させるために重要です。この記事では、初心者向けに手順を詳しく説明します。MySQLをデータベースとして使用し、以下のテーブル構成を前提としています。

データベースの設計

前々回の記事【PHP】ログイン機能を実装してみよう!と前回の記事PHPでログイン機能を実装する方法と同じテーブルの構成でいきます。

念のため、テーブル作成のコードも記載しますね!

CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) NOT NULL UNIQUE,
    password VARCHAR(255) NOT NULL,
    email VARCHAR(100),
    full_name VARCHAR(100),
    registration_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE sessions (
    id INT AUTO_INCREMENT PRIMARY KEY,
    session_id VARCHAR(100) NOT NULL,
    user_id INT NOT NULL,
    expire_time TIMESTAMP NOT NULL,
    FOREIGN KEY (user_id) REFERENCES users(id)
);

既に前回の記事などでテーブルを作成済みの方は省いてください。

パスワードリセットリクエストの送信フォームの作成

ユーザーがパスワードをリセットするためのフォームを作成します。これには、ユーザーのメールアドレスを入力するフォームが必要です。

<form action="reset_password.php" method="post">
    <label>登録したメールアドレス:</label>
    <input type="email" name="email" required><br>
    <input type="submit" value="パスワードをリセット">
</form>

リセットトークンを生成は何故必要なの?

リセットトークンを生成する理由は、パスワードリセット機能のセキュリティを向上させるためです。以下に、その必要性をいくつかのポイントで説明します。

認証の確認

パスワードをリセットするためには、誰がリクエストしたのかを確認する必要があります。リセットトークンを生成することで、ユーザーが正当なリセットリクエストを行ったことを確認し、認証を行うことができます。

セキュリティの向上

リセットトークンはランダムな文字列であり、推測が困難です。これにより、不正なユーザーが他のユーザーのパスワードをリセットすることを防ぎます

有効期限の管理

リセットトークンには有効期限を設定することができます。有効期限が切れたトークンは無効になり、セキュリティを強化します。

一意性の確保

リセットトークンはユーザーごとに一意であり、複数のユーザーが同じトークンを使用することはありません。これにより、パスワードリセットプロセスが正確で追跡可能になります。

以上の理由から、リセットトークンの生成はパスワードリセット機能において重要です。

パスワードリセット処理の作成

PHPでパスワードリセット処理を実装します。まず、ユーザーが送信したメールアドレスを受け取り、そのメールアドレスに対応するユーザーをデータベースから検索します。次に、リセットトークンを生成し、セッションに保存して、ユーザーにリセットリンクを送信します。

<?php
// データベースに接続するための情報
$servername = "localhost";
$username = "ユーザー名";
$password = "パスワード";
$dbname = "データベース名";

// メールアドレスを受け取る
$email = $_POST['email'];

// データベースに接続
$conn = new mysqli($servername, $username, $password, $dbname);

// 接続を確認
if ($conn->connect_error) {
    die("データベースに接続できません: " . $conn->connect_error);
}

// ユーザーをメールアドレスから検索
$sql = "SELECT * FROM users WHERE email='$email'";
$result = $conn->query($sql);

if ($result->num_rows == 1) {
    // ユーザーが見つかった場合
    $row = $result->fetch_assoc();
    $user_id = $row['id'];

    // リセットトークンを生成
    $reset_token = bin2hex(random_bytes(32));

    // セッションにトークンを保存
    session_start();
    $_SESSION['reset_token'] = $reset_token;
    $_SESSION['reset_user_id'] = $user_id;

    // ユーザーにリセットリンクを送信するコードをここに追加

    echo "パスワードリセットリンクを送信しました。";
} else {
    // ユーザーが見つからなかった場合
    echo "そのメールアドレスは登録されていません。";
}

// データベース接続を閉じる
$conn->close();
?>

パスワードのリセット処理

ユーザーがリセットリンクをクリックした場合、セッションに保存されたトークンとユーザーIDを使用して、ユーザーを認証し、新しいパスワードを設定するページを表示します。

<?php
session_start();

// セッションからトークンとユーザーIDを取得
$reset_token = $_SESSION['reset_token'];
$user_id = $_SESSION['reset_user_id'];

// リセットトークンを確認
if (!isset($reset_token) || !isset($user_id)) {
    echo "無効なリクエストです。";
    exit;
}

// ここに、パスワードのリセットフォームを表示するコードを追加
?>

まとめ

以上が、PHPでパスワードリセット機能を実装する手順です。初心者の方でもこの手順に従ってパスワードリセット機能を実装することができます。パスワードリセット機能の実装は、ユーザーの利便性とセキュリティを向上させる重要な機能ですので、ぜひ取り組んでみてください。

Follow me!