ทำระบบ api ส่งข้อมูลให้ฝั่ง mobile ดึงข้อมูล บางส่วนมันไม่ใช่ความลับ จะทำระบบ authentication โหดๆ ก็เปลือง จะไม่ตรวจอะไรเลยก็ดูมันอ่อนไป สุดท้ายมาจบที่คำว่า basic API token คือ ขอแค่ส่ง token มาให้ถูกก็พอละจะได้ไม่โหลด server มาก ไว้ใช้กับส่วนที่เป็นการดึงข้อมูล common ๆ ง่ายๆ ที่ user ใช้ร่วมกันได้ไม่มีความลับอะไร
เริ่มจากทำ middleware ชื่อ apitoken ง่ายๆ มาใช้เอง
- ใช้ command สร้างขึ้นมา
Defining Middleware 1php artisan make:middleware ApiToken
มันจะสร้างไฟล์ขึ้นมาใหม่ที่ \app\Http\Middleware
\app\Http\Middleware\ApiToken.php 1234567891011121314151617181920<?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
);
}
}
- แก้โดยให้อ่านค่ามาจาก Environment Configuration แล้วเทียบกับค่าที่ส่งมา ว่าตรงมั๋ย ตรงก็ปล่อยผ่อนไป ไม่ตรงก็อด
\app\Http\Middleware\ApiToken.php 12345678910111213141516171819202122232425262728293031<?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
);
}
}
เพิ่มขึ้นมาไม่กี่บรรทัดเอง
- เปิดไฟล์ .env มาเพิ่ม config token ที่ใช้เข้าไป
\.env 123...
API_TOKEN=a6b042ae282d91ab2c25bc7ae515af68
...
- กำหนด url ที่ใช้ basic token ง่ายๆของเราโดยการแก้ routing ตามแบบ
\routes\api.php 12345678Route::group([
'middleware'
=>
'api.token'
,
'prefix'
=>
'common'
,
],
function
() {
Route::get(
'cars'
,
'CarsController@json'
);
});
ทุก route ที่อยู่ใน block นี้จะได้รับการปกป้องด้วย api.token
- แต่ตอนนี้ laravel ยังไม่รู้จักกับ api.token เราจะต้องไปเปิดไฟล์ \app\Http\Kernel.php และเพิ่ม $routeMiddleware ตามตัวอย่าง
\app\Http\Kernel.php 12345protected
$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.