چگونه در Rest Api وردپرس ، دسترسی Token برای گسترش استارتاپ ایجاد کنیم ؟

چگونه در Rest Api وردپرس ، دسترسی Token برای گسترش استارتاپ ایجاد کنیم ؟

همیشه یکی از نیاز های اساسی یک استارتاپ ، توسعه بخش API آن است.این امر باعث می شود به سرعت توسعه دهندگان دیگر در پروژه ها از امکانات وب سایت شما استفاده کرده ، در نتیجه باعث پیشرفت سریع استارتاپ و فروش محصولات می شود.
اگر در حال توسعه یک استارتاپ در بستر وردپرس هستید می بایست این امکان را  wp rest api پیاده سازی کنید.بهترین الگو را در این زمینه میتوان ایجاد یک Api Token برای دیگر اعضا دانست.اگر چه Rest Api وردپرس در حالت عادی از Basic Authentication که با ورودی نام کاربری و رمز عبور استفاده می شود. اما الگورریتم های جدید تری به نام JWT وجود دارد که بسیاری از استارتاپ ها مانند اینستاگرام ، میلرلایت و … به سمت آن حرکت کرده اند.

وردپرس rest api

در این مقاله هدف من طرح مسئله ایجاد Token و دسترسی کاملا امن به هر کاربر ، توسط یک کد رمز در بستر WordPress Rest Api می باشد.

ایجاد Token در وردپرس Rest Api

بیایید شروع کنیم اولین قدم این است که برای هر کاربر یک کد Api token ایجاد کنیم.طبق مستندات وردپرس ، مکان قرارگیری اطلاعات اضافی کاربران وردپرس در جدول Usermeta می باشد.ما هم یک نام کلیدی مثل “api_token” را انتخاب می کنیم و برای هر کاربر این کد را ایجاد می کنیم.

ابتدا در جدول لیست کاربران مدیریت وردپرس (Users.php) ، یک ردیف جدید به نام Api token ایجاد می کنیم تا بتوانیم کد Api هر کاربر را نمایش دهیم یا در صورت لزوم ایجاد کنیم.ابتدا توسط فیلتر وردپرس manage_users_columns یک ردیف جدید ایجاد می کنیم.

add_action('manage_users_columns','wp_add_user_column');
function wp_add_user_column($columns) {
    $columns['user_auth_key'] = "Api token";
    return $columns;
}

حال برای شناسه user_auth_key ، جهت نمایش Api Token کاربران دستورات لازم را می نویسیم :

add_filter('manage_users_custom_column', 'user_posts_count_column_content', 10, 3);
function user_posts_count_column_content($output,$column_name,$user_id) {
    if($column_name =="user_auth_key") {
        /* Set Auth Key For User */
        if( isset($_GET['set_user_token']) and $_GET['set_user_token'] ==$user_id) {
            update_user_meta($user_id, 'api_token', wp_generate_password(50, false));
        }
        $user_token = get_user_meta($user_id, "api_token", true);
        if($user_token !="") {
	        $output = $user_token;
        } else {
            $output = '<a href="'.admin_url('users.php?set_user_token='.$user_id).'" class="button button-primary">Get Token</a>';
        }
    }
    return $output;
}

در کد بالا گفته شده اگر در ردیف user_auth_key باشیم ابتدا چک شود کاربر یک User meta به نام api_token در بانک اطلاعاتی دارد یا خیر ؟
اگر وجود داشت که آن را نمایش بدهد در غیر این صورت یک دکمه ایجاد کردیم تا مدیریت بتواند برای کاربر token ایجاد کند.
همیشه token می بایست یک عبارت تصادفب باشد یه همبن دلیل من از تابع wp_generate_password برای ایجاد عبارت 50 کاراکتری تصادفی استفاده کردم.

لیست api token کاربران وردپرس

 

آموزش ایجاد مسیر Route در وردپرس Rest Api

می خواهیم یک مسیر جدید در وردپرس Rest Api ایجاد کنیم که در آن کاربر ابتدا Token خود را به صورت Header درخواست ارسال کند و مشخصات پروفایل خود را در وب سایت خود به نمایش در بیاورد.برای ایجاد مسیر از اکشن rest_api_init استفاده می کنیم.

add_action( 'rest_api_init', 'add_custom_users_api');
function add_custom_users_api(){
	register_rest_route( 'method', '/get_user/', array(
		'methods' => 'GET',
		'callback' => 'get_custom_users_data',
	));
}

ابتدا توسط تابع register_rest_route یک مسیر جدید ایجاد کردیم.برای خروجی این مسیر با فرض این که دامنه ما Realwp.net باشد به صورت زیر در می آید :

https://realwp.net/wp-json/method/get_user/

شاید شما هم مثل من از عبارت wp-json در آدرس وب سرویس خوشتان نیاید.جهت تغییر این کلید از فیلتر rest_url_prefix استفاده کنیم.دقت کنید بعد از قرار دادن این کد حتما می بایست در تنظیمات پیوند یکتا وردپرس وارد شوید و یک بار دکمه ذخیره پیوند ها را بزنید تا آدرس دهی ها بروز شوند.

add_filter( 'rest_url_prefix', 'buddydev_api_slug');
function buddydev_api_slug( $slug ) {
	$slug = 'api';
	return $slug;
}

با تغییر بالا ، آدرس مسیر ما به این شکل تغییر می کند.

https://realwp.net/api/method/get_user/

اگر به اکشن ایجاد مسیر دقت کنید در پارامتر callback مشخص کردیم که اطلاعات برای تحلیل به تابع get_custom_users_data ارسال شود.این تابع را به شکل زیر می نویسیم :

function get_custom_users_data(){
//Check Authoration
$header = getallheaders();
//check Authorization
if (array_key_exists("Authorization",$header) ===false)
{
	return new WP_Error( 'error', 'Token Not found', array( 'status' => 404 ) );
}

//Check User token
$user = get_users([
   'meta_key' => 'api_token' ,
   'meta_value' => $header['Authorization'],
   'number' => 1
]);
if(count($user) ==1) {

	$result = [
      'status' => 'yes',
      'data' => [
        'name' => $user[0]->display_name,
        'date_register' => parsidate("Y-m-d", $user[0]->user_registered, "eng"),
        'email' => $user[0]->user_email,
      ]
    ];
	return new WP_REST_Response($result, 200);

} else {
	return new WP_Error( 'error', 'Token is wrong', array( 'status' => 404 ) );
}
}

طبق مستنداتی که به کاربران وب سرویس خود ارایه می دهید آن ها را مجاب کنید که کلید توکن token خود را در خواست به صورت Header با کلید Authorization ارسال کنند. در خط ابتدایی این توسط تابع php به نام getallheaders ، مقادیر هایی که به صورت Header به این تابع ارسال شده است را چک میکند در صورتی که پارامتر Authorization  وجود نداشت کاربر با پیغام خطا مواجه می شود.

بعد از آن می بایست چک کنیم که آیا کاربری با این توکن token در بانک اطلاعاتی وردپرس وجود دارد یا خیر .در اینجاست که توسط تابع get_users بررسی می کنیم که آیا کاربری با چنین متایی وجود دارد یا خیر در صورت وجود ، اطلاعات پروفایل کاربری در قالب json بازگردانده می شود.در شکل زیر تست این مسیر در نرم افزار postman را مشاهده می کنید :

تست آدرس Route در وردپرس rest api

تاریخ ثبت نام را بصورت شمسی نمایش دادیم.برای توسعه وب فارسی در وردپرس می توانید از مقاله استفاده از افزونه پارسی دیت در زیر استفاده کنید :

حتما بخوانید : چگونه با افزونه پارسی دیت ، استارت آپ های وردپرس فارسی را توسعه دهیم ؟

آموزش ایجاد مستندات وب سرویس برای توسعه دهندگان

حال نوبت به آن می رسد که یک فایل پی دی اف برای وب سرویس خود ایجاد کنید تا دیگر برنامه نویسان بتوانند از این قابلیت در سایت یا اپلیکیشن خود کنند.برای مثال بالا کافیست بیان کنید یک درخواست به صورت GET به آدرس ارسال نموده که مقدار Header آن برابر با Token کاربری شما باشد.من این کار را توسط تابع Curl در php بصورت زیر انجام می دهم :

<?php
$curl = curl_init();
curl_setopt_array($curl, array(
	CURLOPT_URL => "https://realwp.net/api/method/get_user/",
	CURLOPT_RETURNTRANSFER=>true,
	CURLOPT_CUSTOMREQUEST => "get",
	CURLOPT_POSTFIELDS => "",
	CURLOPT_HTTPHEADER => array(
		"Authorization: XYC6yzl6Vs9sUdHEKXybxf9x19e6KuypcdpsTCdo",
	),
));
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);

$result = json_decode($response, true)['data'];
foreach($result as $key => $value) {
	echo $key." : ".$value;
	echo "<br>";
}

اگر در مروگر این کد را اجرا کنیم خروجی نهایی آن بصورت زیر در می آید :

نمایش Curl در وب سایت

اگر دانش کافی در Rest Api وردپرس داشته باشید براحتی می توانید وب اپلیکیشن های بینظیر در کنار Vuejs یا React ایجاد کنید و توسعه استارتاپ خود را مبتنی بر هسته ی وردپرس به طور چشم گیری افزایش دهید.



مطلب رو به اشتراک بگذارید