Hướng dẫn
Quảng cáo

Đăng nhập xác thực hai yếu tố của Google bằng PHP

Hướng dẫn đăng nhập bằng PHP với xác thực 2 yếu tố sử dụng Google Authenticator App

Trong bài trước của chúng tôi, giải thích bạn về Mẫu code đăng nhập bằng PHP với kết nối PDO.. Đây là một tính năng bổ sung có thể được thêm vào hệ thống đăng nhập cho một lớp bảo mật bổ sung. Đây là xác thực 2 yếu tố sử dụng Google Authenticator App dành cho Android / iPhone. Tài khoản của bạn có thể có nguy cơ bị mất mật khẩu. Xác minh 2 bước có thể bảo vệ khỏi sử dụng sai tài khoản của bạn nếu người nào đó có mật khẩu của bạn vì đăng nhập vào tài khoản của bạn luôn yêu cầu mã bảo mật (mã xác minh này được thiết kế riêng cho tài khoản của bạn, nếu bạn chọn mã xác minh, sẽ gửi một mã duy nhất Di động của bạn trong khoảng 30-60 giây) trong bước thứ hai sau khi bạn nhập mật khẩu.

Với xác minh 2 bước, bạn có thể bảo vệ tài khoản của mình bằng mật khẩu và điện thoại di động. Thêm xác thực 2 yếu tố này để làm cho tài khoản của bạn mạnh mẽ hơn.

Tải Google Authenticator trên điện thoại của bạn
Tải xuống và cài đặt ứng dụng Google Authenticator trên thiết bị di động của bạn, click vào các biểu tượng dưới đây để tải app. Bạn cần phần mềm này để xác thực người dùng 2 bước (Quét mã QR để lấy mã đăng nhập cho bước 2).

Google Authenticator Google Authenticator

Users Table

Bảng người dùng chứa tất cả chi tiết đăng ký của người dùng, ở đây bạn phải lưu các chi tiết người dùng bằng mã xác thực duy nhất của Google.

Ví dụ

 CREATE TABLE `users` (
`uid` int NOT NULL PRIMARY KEY AUTO_INCREMENT ,
`username` varchar(25) NOT NULL UNIQUE,
`password` varchar(200) NOT NULL ,
`email` varchar(100) NOT NULL,
`name` varchar(100) NOT NULL,
`profile_pic` varchar(200) NOT NULL,
`google_auth_code` varchar(16) NOT NULL /* 16 digit code */
);

Kích hoạt tính năng PDO extension cho PHP, tìm tệp tin này trong tệp cấu hình php.ini.

Hướng dẫn này chứa hai thư mục được gọi là googleLib và class với các tệp PHP.

Ví dụ

googleLib
-- GoogleAuthenticator.php // Google Authentication Library
class
-- userClass.php
config.php // Database configration file
index.php // Login and Signup page
device_confimation.php // Device confirmation page.
home.php // User welcome page
logout.php // Logout Page
sessions.php // User session
 

Ghi chú: Bạn truy cập vào https://github.com/PHPGangsta/GoogleAuthenticator để tải thư viện Google Authentication nhé

config.php
Tập tin cấu hình kết nối cơ sở dữ liệu, ở đây bạn phải sửa đổi tên người dùng, mật khẩu và các chi tiết cơ sở dữ liệu. Nếu bạn đang sử dụng cơ sở dữ liệu khác thay đổi giá trị kết nối trình điều khiển PDO ().

Ví dụ

<?php
session_start();
/* DATABASE CONFIGURATION */
define('DB_SERVER', 'localhost');
define('DB_USERNAME', 'username');
define('DB_PASSWORD', 'password');
define('DB_DATABASE', 'databasename');
define("BASE_URL", "http://localhost/PHPLoginHash/"); // Eg. http://yourwebsite.com
function getDB()
{
$dbhost=DB_SERVER;
$dbuser=DB_USERNAME;
$dbpass=DB_PASSWORD;
$dbname=DB_DATABASE;
try {
$dbConnection = new PDO("mysql:host=$dbhost;dbname=$dbname", $dbuser, $dbpass);
$dbConnection->exec("set names utf8");
$dbConnection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
return $dbConnection;
}
catch (PDOException $e) {
echo 'Connection failed: ' . $e->getMessage();
}
}
?>

Biểu mẫu Đăng ký - Đăng nhập HTML

Bài đăng này sẽ giúp bạn thiết kế các mẫu đăng nhập và đăng ký HTML Mẫu code đăng nhập bằng PHP với kết nối PDO..

userClass.php
Class này chứa các phương thức userLogin, userRegistionuserDetails.

Ví dụ

<?php
class userClass
{
/* User Login */
public function userLogin($usernameEmail,$password)
{
try{
$db = getDB();
$hash_password= hash('sha256', $password); //Password encryption
$stmt = $db->prepare("SELECT uid FROM users WHERE (username=:usernameEmail or email=:usernameEmail) AND password=:hash_password");
$stmt->bindParam("usernameEmail", $usernameEmail,PDO::PARAM_STR) ;
$stmt->bindParam("hash_password", $hash_password,PDO::PARAM_STR) ;
$stmt->execute();
$count=$stmt->rowCount();
$data=$stmt->fetch(PDO::FETCH_OBJ);
$db = null;
if($count)
{
$_SESSION['uid']=$data->uid; // Storing user session value
$_SESSION['google_auth_code']=$google_auth_code; //Stroing Google authentication code
return true;
}
else
{
return false;
}
}
catch(PDOException $e) {
echo '{"error":{"text":'. $e->getMessage() .'}}';
}
}
/* User Registration */
public function userRegistration($username,$password,$email,$name,$secret)
{
try{
$db = getDB();
$st = $db->prepare("SELECT uid FROM users WHERE username=:username OR email=:email");
$st->bindParam("username", $username,PDO::PARAM_STR);
$st->bindParam("email", $email,PDO::PARAM_STR);
$st->execute();
$count=$st->rowCount();
if($count<1)
{
$stmt = $db->prepare("INSERT INTO users(username,password,email,name,google_auth_code) VALUES (:username,:hash_password,:email,:name,:google_auth_code)");
$stmt->bindParam("username", $username,PDO::PARAM_STR) ;
$hash_password= hash('sha256', $password); //Password encryption
$stmt->bindParam("hash_password", $hash_password,PDO::PARAM_STR) ;
$stmt->bindParam("email", $email,PDO::PARAM_STR) ;
$stmt->bindParam("name", $name,PDO::PARAM_STR) ;
$stmt->bindParam("google_auth_code", $secret,PDO::PARAM_STR) ;
$stmt->execute();
$uid=$db->lastInsertId(); // Last inserted row id
$db = null;
$_SESSION['uid']=$uid;
return true;
}
else
{
$db = null;
return false;
}
}
catch(PDOException $e) {
echo '{"error":{"text":'. $e->getMessage() .'}}';
}
}
/* User Details */
public function userDetails($uid)
{
try{
$db = getDB();
$stmt = $db->prepare("SELECT email,username,name,google_auth_code FROM users WHERE uid=:uid");
$stmt->bindParam("uid", $uid,PDO::PARAM_INT);
$stmt->execute();
$data = $stmt->fetch(PDO::FETCH_OBJ); //User data
return $data;
}
catch(PDOException $e) {
echo '{"error":{"text":'. $e->getMessage() .'}}';
}
}
}
?>

Index.php
Chứa mã PHP và HTML, làm việc dựa trên mẫu người dùng gửi .

Ví dụ

<?php
include("config.php");
if(!empty($_SESSION['uid']))
{
header("Location: device_confirmations.php");
}
include('class/userClass.php');
$userClass = new userClass();
require_once 'googleLib/GoogleAuthenticator.php';
$ga = new GoogleAuthenticator();
$secret = $ga->createSecret(); //This function will create unique 16 digit secret key
$errorMsgReg='';
$errorMsgLogin='';
/* Login Form */
if (!empty($_POST['loginSubmit']))
{
$usernameEmail=$_POST['usernameEmail'];
$password=$_POST['password'];
if(strlen(trim($usernameEmail))>1 && strlen(trim($password))>1 )
{
$uid=$userClass->userLogin($usernameEmail,$password);
if($uid)
{
$url=BASE_URL.'home.php';
header("Location: $url"); // Page redirecting to home.php
}
else
{
$errorMsgLogin="Please check login details.";
}
}
}
/* Signup Form */
if (!empty($_POST['signupSubmit']))
{
$username=$_POST['usernameReg'];
$email=$_POST['emailReg'];
$password=$_POST['passwordReg'];
$name=$_POST['nameReg'];
/* Regular expression check */
$username_check = preg_match('~^[A-Za-z0-9_]{3,20}$~i', $username);
$email_check = preg_match('~^[a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+\.([a-zA-Z]{2,4})$~i', $email);
$password_check = preg_match('~^[A-Za-z0-9!@#$%^&*()_]{6,20}$~i', $password);
if($username_check && $email_check && $password_check && strlen(trim($name))>0)
{
$uid=$userClass->userRegistration($username,$password,$email,$name);
if($uid)
{
$url=BASE_URL.'home.php';
header("Location: $url"); // Page redirecting to home.php
}
else
{
$errorMsgReg="Username or Email already exists.";
}
}
}
?>
//HTML Code
....Login Form HTML Code....
....Signup Form HTML Code...

Note:  Bạn phải thêm vào cách kiểm trang thông tin người dùng nhập bằng JavaScript để có trải nghiệm người dùng tốt hơn.

device_confirmation.php

Ví dụ

<?php
include('config.php');
if(empty($_SESSION['uid']))
{
header("Location: index.php");
}
include('class/userClass.php');
$userClass = new userClass();
$userDetails=$userClass->userDetails($_SESSION['uid']);
$secret=$userDetails->google_auth_code;
$email=$userDetails->email;
require_once 'googleLib/GoogleAuthenticator.php';
$ga = new GoogleAuthenticator();
$qrCodeUrl = $ga->getQRCodeGoogleUrl($email, $secret,'Your Application Name');
?>
//HTML Code
Enter the verification code generated by Google Authenticator app on your phone.
<div id="img">
<img src='<?php echo $qrCodeUrl; ?>' />
</div>
<form method="post" action="home.php">
<label>Enter Google Authenticator Code</label>
<input type="text" name="code" />
<input type="submit" class="button"/>
</form>

home.php
Trang chào mừng của người dùng, hiển thị chi tiết người dùng dựa trên giá trị phiên của người dùng.

Ví dụ

<?php
include('config.php');
include('class/userClass.php');
$userClass = new userClass();
$userDetails=$userClass->userDetails($_SESSION['uid']);
if($_POST['code'])
{
$code=$_POST['code'];
$secret=$userDetails->google_auth_code;
require_once 'googleLib/GoogleAuthenticator.php';
$ga = new GoogleAuthenticator();
$checkResult = $ga->verifyCode($secret, $code, 2);    // 2 = 2*30sec clock tolerance
if ($checkResult)
{
$_SESSION['googleCode']=$code;
}
else
{
echo 'FAILED';
}
}
include('session.php');
$userDetails=$userClass->userDetails($session_uid);
?>
//HTML Code
<h1>Welcome <?php echo $userDetails->name; ?></h1>
<h2> Email <?php echo $userDetails->email; ?></h2>
<a href="<?php echo BASE_URL; ?>logout.php">Logout</a>

session.php
File này sẽ xác nhận và lưu trữ giá trị phiên của người dùng (user session).

Ví dụ

<?php
if(!empty($_SESSION['uid']) && !empty($_SESSION['googleCode']))
{
$session_uid=$_SESSION['uid'];
$session_googleCode=$_SESSION['googleCode'];
}
if(empty($session_uid) && empty($session_googleCode))
{
$url=BASE_URL.'index.php';
header("Location: $url");
}
?>

logout.php
Mã này sẽ xóa các giá trị phiên của người dùng.

Ví dụ

<?php
include('config.php');
$session_uid='';
$session_googleCode='';
$_SESSION['uid']='';
$_SESSION['googleCode']='';
if(empty($session_uid) && empty($_SESSION['uid']))
{
$url=BASE_URL.'index.php';
header("Location: $url");
}
?>
 

Bài viết này đã giúp ích cho bạn?

Bài viết mới

Advertisements