دسته بندی : زبان برنامه نویسی PHP چهارچوب MVC

جلسه سوم | ساخت یک ساخت یک api Token Generator ساده از صفر تا صد

و در پرده آخر ما باید یک کلاسی درست کنیم که هسته اصلی برنامه ما یعنی تولید توکن جدید رو بر عهده داره برای این کار ما باید از دو کلاس که ساختیم کمک بگیریم

  1. کلاس request 
  2. کلاس DB

ابتدا ما باید در جدول کاربران خودمون دو تا فیلد اضافه کنیم این دوتا فیلد نام هاش اختیاری هستش من میزارم 

  • api_token
  • api_token_expired_at

یه جورایی STRUCTURE جدول کاربران من به این شکل در میاد : 


همونطور که مشاهده میکنید یک جدول کوچیک برای کاربران ساختم

قدم بعدی ساخت کلاس API هستش خاصیت این کلاس اینه که بر اساس توکن که از ورودی میگیره اگر زمان تولید منقضی شده باشه توکن جدید میسازه و این توکن رو بر میگردونه 

class API{

    /*
    * $user  = پروپرتی که ما در آن کاربر جاری خودمون رو ذخیره میکنیم
    * $token = توکن جاری ما زمانی که instance صورت میگیرد به ما داده میشود
    */
    protected $token , $user ;

    const
        table = "users" , // جدول کاربران ما
        token_field = "api_token" , // فیلد توکن در جدول کاربران
        token_expired_at_field = "api_token_expired_at" , // فیلد زمان اکسپایر توکن در جدول کاربران
        token_regenrate_time = 30 ; // مقدار زمان اکسپایر توکن چقدر باشد

    /*
    * $token = یک استرینگ یونیک از ورودی دریافت میکنیم
    */
    public function __construct( $token )
    {
        $this->token = $token ;
    }

    /*
    * $length = مقدار طول رشته ای یونیک که قرار ساخته بشه 
    * @mixed string
    */
    private function generateToken( $length = 20 )
    {
        $temp = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" ;
        $generate = "" ;
        for ( $i = 0 ; $i < $length ; $i++ ){
            $begin = 0 ;
            $end = mb_strlen($temp) - 1  ;
            $generate .=  $temp[ random_int( $begin , $end ) ] ;
        }
        return $generate ;
    }

    /*  
    * کار این متد پیدا کردن کاربر ما بر اساس توکنی که دریافت کرده
    * @mixed boolen 
    */
    private function findTokenUser()
    {
        $user = DB::table(self::table )
            ->select([
                self::token_expired_at_field ,
                self::token_field ,
            ])
            ->where(self::token_field , "=" , $this->token )
            ->first() ;
        $this->user = $user ;
        return $user ;
    }

    /*
    * چک میکند ایا توکن کاربر منقضی شده است یا خیر
    *  @mixed boolean 
    */
    private function checkRegenrateToken($user)
    {
        if ( !! $user ){
            $now = new DateTime() ;

            $expired_at = $user->{ self::token_expired_at_field } ;
            $expired_at = new DateTime( $expired_at ) ;

            if ( $now >= $expired_at ){
                return true ;
            }
        }
        return false ;
    }

    /*
    * کار و هسته اصلی کلاس در صورتی که توکن منقضی شده باشد تولید توکن جدید و ذخیره به جای توکن قدیمی
    * و همچنین آپدیت زمان اکسپایر توکن زمانی که توکن وجود نداشته باشد مقدار false و در صورت وجود token را بر میگرداند
    * @mixed string || boolean 
    */
    public function token()
    {
        $user = $this->findTokenUser() ;
        if( !! $user )
        {
            $token = $user->{ self::token_field } ;
            //when expired token
            if ( $this->checkRegenrateToken($user) ){
                $token = $this->generateToken() ;
                $expire_at = ( new DateTime() )
                    ->modify( sprintf("+%s minutes" , self::token_regenrate_time ) )
                    ->format("Y-m-d H:i:s") ;

                DB::table( self::table )
                    ->where( self::token_field , "=" , $this->user->{ self::token_field } )
                    ->update([
                        self::token_field => $token ,
                        self::token_expired_at_field => $expire_at
                    ]);
            }
        }
        return $token ?? false ;
    }
}

خوب قدم بعدی ما اینه که کلاس رو instance کنیم و مقدار ورودی خودمون رو بهش بدم یعنی : 

$token = new API( (new Request)->get("token") ) ;

در خط بالا ما به وسیله کلاس request که ساختیم مقدار token رو از ورودی خودمون گرفتیم مثلا ما اگه همچین url داشته باشیم : 

http://localhost/?token=cmBWYbQX8RCuwdFuaBs3

در دیتابیس جستجو میکنه ببینه اصلا به ازای cmBWYbQX8RCuwdFuaBs3 کاربری وجود دارد ؟! اگه وجود داشت ببین توکنش منقضی شده ! اگه منقضی شده توکن جدیدی برام بساز و جایگزین رو به من برگردون و اگه نشده همین توکن رو برگردون ولی اگه اصلا به ازای این توکن کاربری رو پیدا نکردی false رو به من نشون بده 

شما میتونید فایل ضمیمه رو دانلود کنید و ببیند چکارا کردیم🤓

0| از0رای

مطالب مشابه


0 دیدگاهافزودن