auth.php
<?php class Auth{ const HOST_NAME = "localhost"; const USER_NAME = "hoge"; const PASSWORD ="hogehoge"; const DATABASE_NAME = "mail"; private $mysqli = null; function __construct(){ $this->mysqli = new mysqli( self::HOST_NAME, self::USER_NAME, self::PASSWORD, self::DATABASE_NAME ); session_start(); } public function register($username, $password){ $password = password_hash($_POST["password"], PASSWORD_DEFAULT); $stmt = $this->mysqli->prepare("INSERT INTO users VALUES(?, ?)"); $stmt->bind_param('ss', $_POST["username"], $password); return $stmt->execute(); } public function login($username, $password){ $stmt = $this->mysqli->prepare( "SELECT password FROM users WHERE username = ?"); $stmt->bind_param('s', $_POST["username"]); $stmt->execute(); $stmt->store_result(); if($stmt->num_rows == 1){ $stmt->bind_result($hash); while ($stmt->fetch()){ if(password_verify($_POST['password'], $hash)){ $_SESSION["username"] = $_POST["username"]; return true; } } } return false; } public function getUser(){ if(isset($_SESSION["username"])) return $_SESSIOn["username"]; return null; } public function logout(){ $_SESSION = array(); session_destroy(); } }
register.php
<?php require_once("auth.php"); $auth = new Auth(); $status = "none"; if(!empty($_POST["username"]) && !empty($_POST["password"])){ if(!preg_match('/^[0-9a-zA-Z]{3,32}$/', $_POST["username"])) $status = "error_username"; else if(!preg_match('/^[0-9a-zA-Z]{8,32}$/', $_POST["password"])) $status = "error_password"; elseif($auth->register($_POST["username"], $_POST["password"])) $status = "ok"; else $status = "failed"; } ?> <head> <script src="http://code.jquery.com/jquery-2.0.0.min.js"></script> <script src="register_check.js"></script> </head> <h1>Jmail新規登録</h1> <?php if($status == "ok"):?> <p>登録完了</p> <?php elseif($status == "failed"): ?> <p>エラー:既に存在するユーザ名です。</p> <?php elseif($status == "none"): ?> <p>ユーザ名(英数字3~32文字)、推測されにくいパスワード(英数字8~32文字)を入力してください。</p> <form method="POST" action=""> ユーザ名:<input type="text" name="username"> パスワード:<input type="password" name="password"> <input type="submit" value="登録"> </form> <?php else: ?> <p>hogehoge</p> <?php endif; ?>
login.php
<?php require_once("auth.php"); $auth = new Auth(); $status = "none"; if($auth->getUser()) $status = "logged_in"; else if(!empty($_POST["username"]) && !empty($_POST["password"])){ if($auth->login($_POST["username"], $_POST["password"])) $status = "ok"; else $status = "failed"; } ?> <h1>ログイン</h1> <?php if($status == "logged_in"): ?> <p>ログイン済み</p> <?php elseif($status == "ok"): ?> <p>ログイン成功</p> <?php elseif($status == "failed"): ?> <p>ログイン失敗</p> <?php else: ?> <form method="POST" action="login.php"> ユーザ名:<input type="text" name="username" /> パスワード:<input type="password" name="password" /> <input type="submit" value="ログイン" /> </form> <?php endif; ?>
logout.php
<?php require("auth.php"); $auth = new Auth(); $auth->logout(); ?> <h1>ログアウト</h1> <p>完了<p>
すげー!