0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

PHP ウェブサイトでパスワード認証する

0
Last updated at Posted at 2026-06-01

はじめに

友人(@digital24s さん)と一緒にウェブサイトのリニューアルを検討しています。ログインが必要なページを作りたいと相談されました。

以前に Node.js+Express+Passport でパスワード認証してみたことがあります。
Node.js+Express+Passport を使ってみた #JavaScript - Qiita

友人のウェブサイトは PHP が実行できるレンタルサーバで運用したいので、PHP プログラムで実装したいと思います。

PHP ウェブサイトでパスワード認証する

ユーザ ID とパスワードで認証するようにしたいと思います。

PHPによる簡単なログイン認証いろいろ #Security - Qiita

ログイン画面を用意する

ログイン画面を用意します。

login.php
<form method="post" action="login.php">
    <label>ユーザーID:</label><input type="text" name="userid"/>
    <label>パスワード:</label><input type="password" name="password"/>
    <button type="submit" name="login">ログイン</button>
</form>

「ログイン」ボタン押下すると、パラメータ login をつけて login.php を呼出します。

ログイン情報を受取って認証処理する

呼出されたら、その情報を受取って認証処理します。

login.php
if (isset($_POST['login'])) {

    $userid = filter_input(INPUT_POST, 'userid');
    $password = filter_input(INPUT_POST, 'password');

    if (ユーザ情報を照合) {

ユーザ情報を照合する

受取ったユーザ ID とパスワードが有効かどうか照合します。

password_hash()とpassword_verify()を用いた暗号化と認証の方法について #PHP - Qiita

以下の形式の users.dat を用意して、これを読込して利用します。

users.dat
{
    "tinymouse": "$2y$10$mkDgO/aP0v5HHYtUtl7qWux7gmvJedQNjMtyxjDKp7vWynB/e8Pgu",
}
login.php
$hashes = json_decode(file_get_contents('./users.dat'), true);    // ユーザデータをファイルから読込     

PHP 組込の password_verify() を使って照合します。

if (isset($_POST['login'])) {
(中略)
    if (isset($hashes[$userid]) && password_verify($password, $hashes[$userid])) {
        $message = "認証成功";
    }
    else {
        $message = "認証失敗";
    }
}

ユーザ情報を登録する

ユーザ情報を登録する機能も用意しておきましょう。

regist.php
<form method="post" action="regist.php">
    <label>ユーザーID:</label><input type="text" name="userid"/>
    <label>パスワード:</label><input type="password" name="password"/>
    <button type="submit" name="regist">ログイン</button>
</form>

PHP 組込の password_hash() を使ってハッシュ化して、ファイルに保存します。

regist.php
$hashes = json_decode(file_get_contents('./users.dat'), true);     

if (isset($_POST['regist'])) {

    $userid = filter_input(INPUT_POST, 'userid');
    $password = filter_input(INPUT_POST, 'password');

    if (isset($hashes[$userid])) {    // 登録済か確認
        $message = "ユーザIDが既に使用されています";
    } 
    else {
        $hashes[$userid] = password_hash($password, PASSWORD_DEFAULT);    // パスワードをハッシュ化して保存
        file_put_contents('./users.dat', json_encode($hashes));    // ユーザデータをファイルに保存
        $message = "ユーザが登録されました";
    }
}

認証情報をセッションに保存する

認証成功したとき、その情報をセッションに保存します。

login.php
session_start();    // セッション開始
(中略)
    if (isset($hashes[$userid]) && password_verify($password, $hashes[$userid])) {    // 認証成功

        $_SESSION['user'] = [    // ユーザ情報をセッションに保存
            'userid' => $userid
        ];

認証情報がセッションに保存されていれば、認証済だと判断できます。

if (isset($_SESSION['user'])) {    
    // 認証されている
}

どのページでも認証確認する

これまでのコードでは、ログイン画面以外のページでは認証確認されません。どのページでも、認証されているか確認するようにしましょう。

◇◇.php
session_start();    // セッション開始

if (!isset($_SESSION['user'])) {    // 認証されていない
    header('Location: /login.php');    // ログインページへリダイレクト
    exit;
}
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?