はじめに
友人(@digital24s さん)と一緒にウェブサイトのリニューアルを検討しています。ログインが必要なページを作りたいと相談されました。
以前に Node.js+Express+Passport でパスワード認証してみたことがあります。
Node.js+Express+Passport を使ってみた #JavaScript - Qiita
友人のウェブサイトは PHP が実行できるレンタルサーバで運用したいので、PHP プログラムで実装したいと思います。
PHP ウェブサイトでパスワード認証する
ユーザ ID とパスワードで認証するようにしたいと思います。
PHPによる簡単なログイン認証いろいろ #Security - Qiita
ログイン画面を用意する
ログイン画面を用意します。
<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 を呼出します。
ログイン情報を受取って認証処理する
呼出されたら、その情報を受取って認証処理します。
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 を用意して、これを読込して利用します。
{
"tinymouse": "$2y$10$mkDgO/aP0v5HHYtUtl7qWux7gmvJedQNjMtyxjDKp7vWynB/e8Pgu",
}
$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 = "認証失敗";
}
}
ユーザ情報を登録する
ユーザ情報を登録する機能も用意しておきましょう。
<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() を使ってハッシュ化して、ファイルに保存します。
$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 = "ユーザが登録されました";
}
}
認証情報をセッションに保存する
認証成功したとき、その情報をセッションに保存します。
session_start(); // セッション開始
(中略)
if (isset($hashes[$userid]) && password_verify($password, $hashes[$userid])) { // 認証成功
$_SESSION['user'] = [ // ユーザ情報をセッションに保存
'userid' => $userid
];
認証情報がセッションに保存されていれば、認証済だと判断できます。
if (isset($_SESSION['user'])) {
// 認証されている
}
どのページでも認証確認する
これまでのコードでは、ログイン画面以外のページでは認証確認されません。どのページでも、認証されているか確認するようにしましょう。
session_start(); // セッション開始
if (!isset($_SESSION['user'])) { // 認証されていない
header('Location: /login.php'); // ログインページへリダイレクト
exit;
}