今回は
・emailと一致するユーザ検索
・passwordが一致するか検証
・ユーザ情報をセッションに格納してログイン
を実装する
パスワード照会の方法
ユーザ入力とDBの値を照会
しかし、パスワードはハッシュ化されている→照会できる関数がある
password_verify(パス、ハッシュ)
パスワードがハッシュにマッチするかを判定する
マッチしたらtrue、しなかったらfalseを返す
セッションハイジャック対策
セッションIDを盗まれて、なりすましをされること
対策:セッションIDを再作成する
手順
ログインロジック作成
前回までに作成したUserLogicクラスの中にログイン専用のメソッドを作成していく。
login
メソッドとする。
top.phpがログインフォーム後のページだから、ここでログインの処理を記述する。
top.php
<?php
require_once('../classes/UserLogic.php');
session_start();
// エラーメッセージ
$err = [];
// バリデーション
if(!$email = filter_input(INPUT_POST, 'email')){
$err['email'] = 'メールアドレスを記入してください';
}
if(!$password = filter_input(INPUT_POST, 'password')){
$err['password'] = 'パスワードを記入してください';
}
if(count($err) > 0){
// エラーがあった場合は戻す
$_SESSION = $err;
header('Location: login.php');
return;
}
// ログイン成功時の処理
$result = UserLogic::login($email, $password);
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>ユーザ登録完了画面</title>
</head>
<body>
<?php if (count($err) > 0) : ?>
<!-- エラーがある場合にforeachで該当エラーを表示させる -->
<?php foreach($err as $e) : ?>
<p><?php echo $e ?></p>
<?php endforeach; ?>
<!-- $err配列に何もない=エラーがない から完了画面を表示させる -->
<?php else: ?>
<p>ユーザー登録が完了しました。</p>
<?php endif ; ?>
<a href="login.php">戻る</a>
</body>
</html>
$result = UserLogic::login($email, $password);
の部分。
そして、そのlogin
メソッドを以下の通りに記述する。
UserLogic.php
/**
* ログイン処理
* @param string $email
* @param string $password
* @return bool $result
*/
public static function login($email, $password)
{
// 結果
$result = false;
// ユーザをemailから検索して取得
$user = self::getUserByEmail($email);
}
emailからユーザ取得ロジック作成
loginメソッドとは別に、emailの照会のためのメソッドを作成する。
UserLogic.php
/**
* ログイン処理
* @param string $email
* @param string $password
* @return bool $result
*/
public static function login($email, $password)
{
// 結果
$result = false;
// ユーザをemailから検索して取得
$user = self::getUserByEmail($email);
return $user;
}
/**
* emailからユーザを取得
* @param string $email
* @return array|bool $user|false
*/
public static function getUserByEmail($email)
{
// SQLの準備
// SQLの実行
// SQLの結果を返す
$sql = 'SELECT * FROM users WHERE email = ?';
// ユーザデータを配列に入れる
$arr = [];
$arr[] = $email;
try{
$stmt = connect()->prepare($sql);
$stmt->execute($arr);
//SQLの結果を返す
$user = $stmt->fetch();
return $user;
}catch(\Exception $e){
return false;
}
}