ketyiaの作ってみた

このサイトでは作ってみたことを記事にまとめていきます!

PHPで認証機能を作成してみる!②

こんにちは!IT勉強中のKeitaです!

この記事では、PHPで認証機能を作るということを記事にまとめています!
認証機能は、フレームワークを使うと簡単に実装できますが、処理の流れや原理を知っておこうということでPHPのみで作成しています!!

本記事では、前回の記事で作成したユーザ情報を基にログインの機能を作成していこうと思います!

流れをしては、下記の順になります。

・HTMLでひな型作成
入力された情報が登録されたものかのチェック
セッション情報を登録

HTMLでひな形作成


画面は下記を用意しました!
ログイン画面とログイン後の画面です。
前回作成したユーザ登録画面へのリンクボタンも用意しておきました。

本記事ではこの2画面を使用していきます!

入力された徐由豊が登録されたものかチェック


ログイン画面に入力された値が、データベースのテーブル(login_users)に登録されているかの確認を行います!

登録されていない場合は、「入力値が間違っています」とメッセージを表示
登録されている場合は、ログイン後の画面に遷移する
という処理でいこうと思います。

コードは下記です!
ログイン画面でログインボタンを押された後の処理です。

ーーーーーーーーーーーーーーーーー
【login_auth.php

<?php
session_start();

// 変数の宣言
$id = '';
$password = '';
$key = '';


// 情報の取得
$id = $_GET['id'];
$password = $_GET['password'];

if( empty($id) || empty($password)){
    $error_message = '入力されていません';
    $_SESSION['error_message'] = $error_message;
    header('Location:login.php');
    exit;
}

// セッションを削除しておく
unset($_SESSION['password']);

// セッションを残しておく
$_SESSION['id'] = $id;

// データベース処理
$db = new PDO('mysql:host=localhost;dbname=login','root','');

try{
    $db->beginTransaction();

    // ログイン情報の登録
    // SQL文実行
    $sql = 'SELECT login_users_id, login_id, password
            FROM login_users
            WHERE login_id = :login_id;';
   
    // 事前にSQL登録
    $sth = $db->prepare($sql);
    // 変数名をバインド
    $sth->bindParam(':login_id', $id);
    // 実行
    $sth->execute();
    // 結果を取得する
    $result = $sth->fetch();

    // 結果は出ているか判定
    if(!empty($result)){
        $_SESSION['id'] = $login_user_id;
        header( 'Location: ok.php' );
        exit;
    }else{
        $error_message = '入力値が間違えています';
    }
}catch (Exception $e) {
    $db->rollback();
    echo $e->getMessage();
}


if(!empty($error_message)){
    $_SESSION['error_message'] = $error_message;
    header('Location:login.php');
    exit;
}

ーーーーーーーーーーーーーーーーー

では、動作確認してみます。


ユーザのログインOKです!
では、これにセッション情報を追加していきます。

セッション情報登録


ここでは、ログインされたユーザに対して「しっかり承認されたユーザです」ということを証明するキーを与えていこうと思います!

このキーを与えておくことで、正規でログインしたユーザ不正でログインしたユーザの判別を行うことが可能となります!

ログインの認証処理にセッションを情報する処理を追加していきます。
try文の中を下記コードに変えていきます!

ーーーーーーーーーーーーーーーーー
【login_auth.php

try{
    $db->beginTransaction();

    // ログイン情報の登録
    // SQL文実行
    $sql = 'SELECT login_users_id, login_id, password
    FROM login_users
    WHERE login_id = :login_id;';

    // 事前にSQL登録
    $sth = $db->prepare($sql);
    // 変数名をバインド
    $sth->bindParam(':login_id', $id);
    // 実行
    $sth->execute();
    // 結果を取得する
    $result = $sth->fetch();

    // 結果は出ているか判定
    if(!empty($result)){
        // パスワードとハッシュ値の確認 /あっていたらログイン
        if(password_verify($password,$result['password'])){
            // 抽出されたユーザのIDを取得
            $login_user_id = $result['login_users_id'];
            // キー 簡単な乱数
            $key = random_int(0, 255);

            $sql = 'INSERT INTO login_session ( login_users_id, pass_key )  VALUES( :login_users_id, :pass_key )';

            $sth = $db->prepare($sql);

            $sth->bindParam(':login_users_id', $login_user_id);
            $sth->bindParam(':pass_key', $key);

            $sth->execute();

            $db->commit();

            $_SESSION['id'] = $login_user_id;
            header( 'Location: ok.php' );
            exit;
        }else{
            $error_message = '入力値が間違えています';
        }
    }else{
        $error_message = '入力値が間違えています';
  }

ーーーーーーーーーーーーーーーーー

では、動作確認をしてみましょう!

しっかりと登録できてますね。
不正ログイン対策は次の記事で行っていきます!

とりあえず、ログイン機能は完成です!

次の記事では、ログアウトについてまとめていきます!

 

begginerkun.hatenablog.com


前の記事はこちら

begginerkun.hatenablog.com