วัน: 31 ตุลาคม 2015

Laravel: Basic API Token Authentication อย่างง่ายLaravel: Basic API Token Authentication อย่างง่าย

ทำระบบ api ส่งข้อมูลให้ฝั่ง mobile ดึงข้อมูล บางส่วนมันไม่ใช่ความลับ จะทำระบบ authentication โหด ๆ ก็เปลือง จะไม่ตรวจอะไรเลยก็ดูมันอ่อนไป สุดท้ายมาจบที่คำว่า basic API token คือ ขอแค่ส่ง token มาให้ถูกก็พอละจะได้ไม่โหลด server มาก ไว้ใช้กับส่วนที่เป็นการดึงข้อมูล common ๆ ง่าย ๆ ที่ user ใช้ร่วมกันได้ไม่มีความลับอะไร

เริ่มจากทำ middleware ชื่อ apitoken ง่าย ๆ มาใช้เอง

  1. ใช้ command สร้างขึ้นมา
    php artisan make:middleware ApiToken

    มันจะสร้างไฟล์ขึ้นมาใหม่ที่ \app\Http\Middleware

    <?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);
     }
    }
  2. แก้โดยให้อ่านค่ามาจาก Environment Configuration แล้วเทียบกับค่าที่ส่งมา ว่าตรงมั๋ย ตรงก็ปล่อยผ่อนไป ไม่ตรงก็อด
    <?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);
     }
    }
    

    เพิ่มขึ้นมาไม่กี่บรรทัดเอง

  3. เปิดไฟล์ .env มาเพิ่ม config token ที่ใช้เข้าไป
    ...
    API_TOKEN=a6b042ae282d91ab2c25bc7ae515af68
    ...
  4. กำหนด url ที่ใช้ basic token ง่าย ๆ ของเราโดยการแก้ routing ตามแบบ
    Route::group([
     'middleware' => 'api.token',
     'prefix' => 'common',
    ], function () {
    
     Route::get('cars', 'CarsController@json');
    
    });

    ทุก route ที่อยู่ใน block นี้จะได้รับการปกป้องด้วย api.token

  5. แต่ตอนนี้ laravel ยังไม่รู้จักกับ api.token เราจะต้องไปเปิดไฟล์ \app\Http\Kernel.php และเพิ่ม $routeMiddleware ตามตัวอย่าง
     protected $routeMiddleware = [
    ...
      'api.token' => \App\Http\Middleware\ApiToken::class,
    ...
     ];

เทสโดยใช้ 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.