การสร้าง API Key สำหรับ Authentication
ในบทก่อนหน้า เราได้เรียนรู้วิธีป้องกัน SQL Injection ด้วย Prepared Statement ซึ่งเป็นสิ่งสำคัญอย่างยิ่งในการรักษาความปลอดภัยของ API ของเรา ในบทนี้ เราจะมาเรียนรู้วิธีการสร้าง API Key ซึ่งเป็นอีกหนึ่งกลไกสำคัญในการยืนยันตัวตน (Authentication) และควบคุมการเข้าถึง API ของเรา
API Key คืออะไร?
API Key เป็นรหัสลับ (Secret Key) ที่มอบให้กับผู้ใช้งาน API แต่ละราย เพื่อใช้ในการระบุตัวตนและอนุญาตให้เข้าถึงทรัพยากรต่างๆ ของ API ได้ API Key ทำหน้าที่คล้ายกับ Username และ Password แต่มีความแตกต่างกันตรงที่ API Key มักจะถูกออกแบบมาเพื่อใช้ใน Application-to-Application (A2A) Communication มากกว่า Human-to-Application Communication
ทำไมต้องใช้ API Key?
- Authentication: ยืนยันว่าผู้ที่กำลังเรียกใช้ API คือใคร
- Authorization: อนุญาตให้ผู้ใช้เข้าถึงทรัพยากรที่ได้รับอนุญาตเท่านั้น
- Usage Tracking: ติดตามการใช้งาน API ของผู้ใช้แต่ละราย เพื่อการวิเคราะห์และจำกัดการใช้งาน
- Security: เพิ่มความปลอดภัยให้กับ API โดยการป้องกันการเข้าถึงโดยไม่ได้รับอนุญาต
ขั้นตอนการสร้าง API Key
การสร้าง API Key สามารถทำได้หลายวิธี ในบทนี้เราจะเน้นวิธีการสร้าง API Key แบบง่ายๆ โดยใช้ PHP และฟังก์ชัน uniqid()
1. การสร้าง API Key ด้วย uniqid()
ฟังก์ชัน uniqid() ใน PHP จะสร้าง Unique ID ที่มีความยาว 13 ตัวอักษร โดยอิงตามเวลาปัจจุบันเป็นหลัก ทำให้มีโอกาสน้อยมากที่จะเกิดการชนกันของ ID ที่สร้างขึ้น
<?php
// สร้าง API Key
$apiKey = uniqid();
// แสดง API Key
echo "API Key: " . $apiKey;
?>
อธิบายโค้ด:
$apiKey = uniqid();: สร้าง API Key โดยใช้ฟังก์ชันuniqid()และเก็บไว้ในตัวแปร$apiKeyecho "API Key: " . $apiKey;: แสดง API Key ที่สร้างขึ้น
ข้อควรระวัง: แม้ว่า uniqid() จะสร้าง Unique ID ได้ดี แต่ก็ไม่ได้มีความปลอดภัยสูงมากนัก หากต้องการความปลอดภัยที่สูงขึ้น ควรพิจารณาใช้ฟังก์ชันเข้ารหัส (Hashing Function) เช่น password_hash() ร่วมด้วย
2. การเก็บ API Key ในฐานข้อมูล
เมื่อเราสร้าง API Key แล้ว สิ่งสำคัญคือการเก็บ API Key นั้นไว้ในฐานข้อมูล เพื่อที่เราจะสามารถตรวจสอบ API Key ที่ผู้ใช้ส่งมาได้
โครงสร้างตาราง (users):
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(255) NOT NULL,
password VARCHAR(255) NOT NULL,
api_key VARCHAR(255) UNIQUE
);
อธิบาย:
id: Primary Key ของตารางusername: ชื่อผู้ใช้งานpassword: รหัสผ่าน (ควรถูกเข้ารหัสด้วยpassword_hash())api_key: API Key ของผู้ใช้งาน (UNIQUEเพื่อป้องกันการสร้าง API Key ที่ซ้ำกัน)
ตัวอย่างการเพิ่ม API Key ลงในฐานข้อมูล:
<?php
// เชื่อมต่อกับฐานข้อมูล (แก้ไขข้อมูลให้ถูกต้อง)
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "database_name";
$conn = new mysqli($servername, $username, $password, $dbname);
// ตรวจสอบการเชื่อมต่อ
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
// สร้าง API Key
$apiKey = uniqid();
// สมมติว่าเรามี user_id อยู่แล้ว
$userId = 1;
// SQL Query สำหรับอัปเดต API Key
$sql = "UPDATE users SET api_key = '$apiKey' WHERE id = $userId";
if ($conn->query($sql) === TRUE) {
echo "API Key generated and saved successfully!";
echo "API Key: " . $apiKey;
} else {
echo "Error updating record: " . $conn->error;
}
$conn->close();
?>
อธิบายโค้ด:
- เชื่อมต่อกับฐานข้อมูล
- สร้าง API Key ด้วย
uniqid() - สร้าง SQL Query เพื่ออัปเดต API Key ในตาราง
usersโดยใช้user_id - Execute SQL Query และตรวจสอบผลลัพธ์
ข้อควรระวัง: ในตัวอย่างนี้ เราใช้ String Interpolation ใน SQL Query ซึ่งอาจทำให้เกิด SQL Injection ได้ (แม้ว่าเราจะใช้ uniqid() ซึ่งค่อนข้างปลอดภัย) ทางที่ดีควรใช้ Prepared Statement เสมอ
3. การตรวจสอบ API Key
เมื่อผู้ใช้ส่ง Request มายัง API ของเรา เราจะต้องตรวจสอบ API Key ที่ส่งมาด้วย เพื่อยืนยันตัวตนของผู้ใช้
ตัวอย่างการตรวจสอบ API Key:
<?php
// เชื่อมต่อกับฐานข้อมูล (แก้ไขข้อมูลให้ถูกต้อง)
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "database_name";
$conn = new mysqli($servername, $username, $password, $dbname);
// ตรวจสอบการเชื่อมต่อ
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
// ดึง API Key จาก Request Header (สมมติว่าส่งมาใน Header ชื่อ X-API-Key)
$apiKey = $_SERVER['HTTP_X_API_KEY'] ?? '';
// SQL Query สำหรับค้นหา API Key ในฐานข้อมูล
$sql = "SELECT id FROM users WHERE api_key = '$apiKey'";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
// API Key ถูกต้อง
echo "API Key is valid. Access granted!";
// ดำเนินการตาม Request ที่ผู้ใช้ส่งมา
} else {
// API Key ไม่ถูกต้อง
http_response_code(401); // Unauthorized
echo "Invalid API Key. Access denied!";
}
$conn->close();
?>
อธิบายโค้ด:
- เชื่อมต่อกับฐานข้อมูล
- ดึง API Key จาก Request Header (ในตัวอย่างนี้ เราสมมติว่า API Key ถูกส่งมาใน Header ชื่อ
X-API-Key) - สร้าง SQL Query เพื่อค้นหา API Key ในตาราง
users - Execute SQL Query และตรวจสอบผลลัพธ์
- หากพบ API Key ที่ถูกต้อง ให้ดำเนินการตาม Request ที่ผู้ใช้ส่งมา
- หากไม่พบ API Key ที่ถูกต้อง ให้ส่ง HTTP Status Code 401 (Unauthorized) และแสดงข้อความแจ้งเตือน
ข้อควรระวัง:
- การเก็บ API Key ใน Request Header: การส่ง API Key ใน Request Header เป็นวิธีที่นิยมใช้กัน แต่ก็ควรระมัดระวังเรื่องความปลอดภัย ควรใช้ HTTPS เพื่อเข้ารหัสการสื่อสารระหว่าง Client และ Server
- Prepared Statement: อย่าลืมใช้ Prepared Statement เพื่อป้องกัน SQL Injection
- Error Handling: ควรจัดการ Error อย่างเหมาะสม เพื่อให้ผู้ใช้ทราบว่าเกิดอะไรขึ้น
กรณีใช้งานจริงและข้อผิดพลาดที่พบบ่อย
- กรณีใช้งาน: Application A ต้องการเข้าถึงข้อมูลจาก Application B โดย Application A จะต้องส่ง API Key ไปพร้อมกับ Request เพื่อยืนยันตัวตน
- ข้อผิดพลาดที่พบบ่อย:
- ลืมเก็บ API Key ในฐานข้อมูล
- ไม่ได้ตรวจสอบ API Key ก่อนอนุญาตให้เข้าถึงทรัพยากร
- ใช้ API Key ที่หมดอายุแล้ว
- เปิดเผย API Key โดยไม่ตั้งใจ (เช่น ใน Source Code หรือ Log Files)
สรุป
ในบทนี้ เราได้เรียนรู้วิธีการสร้าง API Key เพื่อใช้ในการ Authentication ซึ่งเป็นขั้นตอนสำคัญในการรักษาความปลอดภัยของ API ของเรา เราได้เรียนรู้การสร้าง API Key ด้วย uniqid() การเก็บ API Key ในฐานข้อมูล และการตรวจสอบ API Key ที่ผู้ใช้ส่งมา นอกจากนี้ เรายังได้พูดถึงกรณีใช้งานจริงและข้อผิดพลาดที่พบบ่อย เพื่อให้คุณสามารถนำความรู้ที่ได้ไปประยุกต์ใช้ได้อย่างมีประสิทธิภาพ
ในบทถัดไป เราจะมาเรียนรู้เกี่ยวกับ Middleware ซึ่งเป็นเครื่องมือที่มีประโยชน์ในการจัดการ Request และ Response ของ API ของเรา