134 ثبت نام با ایمیل و کد یکبار مصرف PHP + MySQL 1325

مانند اینستاگرام، توییتر، پینترست، یوتیوب و خیلی از شبکه اجتماعی های دیگه که برای فعال سازی اکانت و احراز هویت برامون کد یکبار مصرف میفرستن ما هم میخوایم با استفاده از PHP و MySQL یک برنامه بک اند بنویسیم که بشه باهاش ثبت نام با ایمیل و فعال سازی اکانت با استفاده از کد یکبار مصرف (OTP Code) رو پیاده سازی کرد، ما میتونیم با استفاده از این متد در بخش ثبت نام برناممون از ایجاد اکانت های فیک و جعلی جلوگیری کنیم دقیقا یکی از راه های قوی جلوگیری از اسپم استفاده از کد یکبار مصرف در فرایند ثبت نام هست البته برای دشوار تر کردن ساخت اکانت فیک توسط اسپمر ها مسائل دیگه ای هم هست که باید رعایت کنیم مثل اعتبارسنجی های قوی در بک اند و... که ما در اینجا با کد یکبار مصرف سروکار داریم. با پیاده سازی چنین برنامه ای میتونیم کاربر رو مجبور به فعال کردن اکانت با کد یکبار مصرف کنیم همچنین میتونیم اجباریش نکنیم اما براش محدودیتی درون بخش های مختلف برناممون ایجاد کنیم و شرط استفاده ازشون رو به فعال کردن اکانت با کد یکبار مصرف گره بزنیم و کار های مختلف و زیاد دیگه ای رو هم میتونیم انجام بدیم... اینکه چه دیتایی میخوایم از کاربر بگیریم و در چند مرحله این کار رو انجام بدیم کاملا دلخواه خودمونه من در این برنامه اول ایمیل رو میگیرم و بعدش کاربر رو میفرستم برای فعال سازی اکانتش، مثلا میتونیم اول ایمیل - نام کاربری - رمز عبور از کاربر بگیریم و بلافاصله بفرستیمش برای فعال سازی اکانت، ما باید بسته به برنامه ای که میخوایم ایجاد کنیم برای این موارد تصمیم گیری کنیم

• نکات

- یک ورژن ویدیویی از این برنامه را در اینستاگرام مشاهده کنید

- ورژن فرانت اند برنامه را به سلیقه خودتان طراحی و پیاده سازی کنید

- شما باید از CRUD و پیکربندی دیتابیس خودتان استفاده کنید (db_config.php)

- میتونید با توسعه این برنامه ارور های مورد نظرتونو بهش اضافه کنید و توسعش بدید

- از سشن ها استفاده می کنیم تا بتونیم کاربر رو بین صفحات انتقال بدیم و براش محدودیت تعریف کنیم

- با فهم معماری این برنامه میتونیم ورژن کد یکبار مصرف به صورت پیامک (SMS) رو هم پیاده سازی کنیم

- این ورژن بیشتر جنبه تست و یادگیری داره برای تبدیل به ورژن Production باید چرخه برنامه رو کامل کنیم


1. ساختار دیتابیس و تیبل مورد نیاز - MySQL

برای بخش دیتابیسمون با استفاده از phpMyAdmin ابتدا یک دیتابیس می سازیم سپس query زیر را درون تب SQL اجرا می کنیم تا تیبل مورد نیازمون ساخته بشه


CREATE TABLE IF NOT EXISTS `accounts` (
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `email` VARCHAR(128) NOT NULL,
    `otp_code` INT(6) DEFAULT NULL,
    `time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP(),
    PRIMARY KEY(`id`)
) ENGINE = INNODB DEFAULT CHARSET = utf8mb4;

نتیجه اجرای query بالا دقیقا حالتی میشه که تو تصویر زیر می بینید، شما همچنین میتونید به صورت دستی اقدام به ساخت تیبل با ساختار مشخص شده توی تصویر زیر کنید

MySQL - ساختار دیتابیس و تیبل مورد نیاز

2. بک اند دریافت ایمیل و تولید کد یکبار مصرف - PHP

یک ایمیل معتبر از کاربر دریافت می کنیم و بلافاصله یک کد یکبار مصرف 6 عددی تولید می کنیم (من کد 6 عددی تولید کردم شما میتونید طول عدد کد دلخواه خودتونو تولید کنید مثلا 4 عددی یا...) سپس ایمیل کاربر و کد تولید شده را بر روی دیتابیس ذخیره می کنیم و در انتها یک ایمیل حاوی کد یکبار مصرف طبق فرمت و سلیقه خودمون برای ایمیل کاربر ارسال می کنیم


<?php
// شروع سشن
session_start();

// پردازش درخواست پست
if ($_SERVER["REQUEST_METHOD"] == "POST") {
    // فراخوانی کانکشن و کلاس دیتابیس
    require('db_config.php');

    // بررسی ایمیل ست شده و دارای مقدار
    if (isset($_POST['email']) && !empty($_POST['email'])) {
        // ست کردن متغیر های مورد نیاز
        $email = htmlspecialchars($_POST['email']);
    }

    // تولید کد یکبار مصرف
    $otp_code = mt_rand(100000, 999999);

    // افزودن اکانت جدید
    $id = $db->Insert(
        "INSERT INTO `accounts`
            (`email`, `otp_code`)
            values (:email, :otp_code)",
        [
            'email' => $email,
            'otp_code' => $otp_code
        ]
    );

    // ست کردن سشن های مورد نیاز برای پردازش در صفحه بعدی
    $_SESSION['email'] = $email;

    // ارسال یک ایمیل حاوی کد یکبار مصرف برای ایمیل کاربر
    mail($email, 'Your OTP Code', $otp_code);

    // ریدایرکت به صفحه فعال کردن اکانت با کد یکبار مصرف
    die(header('Location: /projects/php-email-otp-verification/account-verify/'));
}
?>

3. بک اند فعال سازی اکانت با استفاده از کد یکبار مصرف - PHP

در این مرحله ما هم ایمیل کاربر و هم کد یکبار مصرفشو درون دیتابیس داریم با توجه به این 2 متغیر میایم و به سادگی در صورت معتبر بودن کد، اکانت کاربر رو فعال می کنیم حالا چطوری فعال می کنیم؟! در عمل ما در این مرحله از کاربر کد رو می گیریم و اگر کد معتبر بود سلول otp_code مربوطه رو NULL می کنیم و در ادامه نوشتن برناممون اکانت های دارای otp_code با مقدار NULL رو اکانت های فعال شده میشناسیم! دقیقا بک اند یعنی این 😂 و در آینده هر قسمت از برناممون که خواستیم اکانت های فعال شده و فعال نشده رو تفکیک کنیم از NULL بودن ستون otp_code شرطشو مینویسیم و شناسایی رو انجام میدیم


<?php
// شروع سشن
session_start();

// پردازش درخواست پست
if ($_SERVER["REQUEST_METHOD"] == "POST") {
    // فراخوانی کانکشن و کلاس دیتابیس
    require('../db_config.php');

    // بررسی کد یکبار مصرف ست شده و دارای مقدار
    if (isset($_POST['otp-code']) && !empty($_POST['otp-code'])) {
        // ست کردن متغیر های مورد نیاز
        $otp_code = htmlspecialchars($_POST['otp-code']);
        $email = $_SESSION['email'];
    }

    // طبق ایمیل کاربر کد یکبار مصرف موجود در اکانتشو پیدا میکنیم
    $check_for_email = $db->Select(
        "SELECT `email`, `otp_code` FROM `accounts` WHERE `email` = :email",
        [
            'email' => $email
        ]
    );

    // در صورتی که هم ایمیل وجود داره هم کد یکبار مصرف درست وارد شده میریم برای فعال کردن اکانت
    if ($check_for_email && $check_for_email[0]['otp_code'] === $otp_code) {
        // کد یکبار مصرف رو نال میکنیم
        $db->Update(
            "UPDATE `accounts` SET `otp_code` = NULL WHERE `email` = :email",
            [
                'email' => $email
            ]
        );
    }

    // نابود کردن کلیه سشن ها
    session_unset();
    session_destroy();

    // ریدایرکت به صفحه تبریک
    die(header('Location: /projects/php-email-otp-verification/congrats/'));
}
?>

نمونه ویدیویی در اینستاگرام

View this post on Instagram

A post shared by سعید کهن سال (@skohansal.ir)



برنامه نویسی PHP برنامه نویسی MySQL