ทำระบบ api ส่งข้อมูลให้ฝั่ง mobile ดึงข้อมูล บางส่วนมันไม่ใช่ความลับ จะทำระบบ authentication โหดๆ ก็เปลือง จะไม่ตรวจอะไรเลยก็ดูมันอ่อนไป สุดท้ายมาจบที่คำว่า basic API token คือ ขอแค่ส่ง token มาให้ถูกก็พอละจะได้ไม่โหลด server มาก ไว้ใช้กับส่วนที่เป็นการดึงข้อมูล common ๆ ง่ายๆ ที่ user ใช้ร่วมกันได้ไม่มีความลับอะไร
เริ่มจากทำ middleware ชื่อ apitoken ง่ายๆ มาใช้เอง
- ใช้ command สร้างขึ้นมา [code language=”text” title=”Defining Middleware”]php artisan make:middleware ApiToken[/code] มันจะสร้างไฟล์ขึ้นมาใหม่ที่ \app\Http\Middleware[code language=”php” title=”\app\Http\Middleware\ApiToken.php”]<?php
namespace App\Http\Middleware;
use Closure;
class ApiToken
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
return $next($request);
}
}[/code] - แก้โดยให้อ่านค่ามาจาก Environment Configuration แล้วเทียบกับค่าที่ส่งมา ว่าตรงมั๋ย ตรงก็ปล่อยผ่อนไป ไม่ตรงก็อด[code language=”php” title=”\app\Http\Middleware\ApiToken.php”]<?php
namespace App\Http\Middleware;
use Closure;
class ApiToken
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{if ($request->expectsJson()) {
if (env(‘API_TOKEN’) != $request->header(‘token’)) {
return response(‘Unauthorized.’, 401);
}} else {
return route(‘login’);
}return $next($request);
}
}
[/code]เพิ่มขึ้นมาไม่กี่บรรทัดเอง - เปิดไฟล์ .env มาเพิ่ม config token ที่ใช้เข้าไป[code language=”text” title=”\.env”]…
API_TOKEN=a6b042ae282d91ab2c25bc7ae515af68
…[/code] - กำหนด url ที่ใช้ basic token ง่ายๆของเราโดยการแก้ routing ตามแบบ[code language=”php” title=”\routes\api.php”]Route::group([
‘middleware’ => ‘api.token’,
‘prefix’ => ‘common’,
], function () {Route::get(‘cars’, ‘[email protected]’);
});[/code]ทุก route ที่อยู่ใน block นี้จะได้รับการปกป้องด้วย api.token
- แต่ตอนนี้ laravel ยังไม่รู้จักกับ api.token เราจะต้องไปเปิดไฟล์ \app\Http\Kernel.php และเพิ่ม $routeMiddleware ตามตัวอย่าง[code language=”php” title=”\app\Http\Kernel.php”] protected $routeMiddleware = [
…
‘api.token’ => \App\Http\Middleware\ApiToken::class,
…
];[/code]
เทสโดยใช้ Postman เรียก url ตามเดิม แต่จะมี common เพิ่มเข้ามาเพราะเพิ่มไปใน route เช่น http://localhost/prototype_laravel/public/api/cars แก้เป็น http://localhost/prototype_laravel/public/api/common/cars และต้องส่ง header ไปโดยมี
- Accept application/json
- token a6b042ae282d91ab2c25bc7ae515af68c
มาพร้อมๆ กันถึงจะสามารถ call api ตัวนี้ได้สำเร็จ ไม่งั้นจะเจอกับ Unauthorized.