メインコンテンツへ移動

เนื้อหาภาษาไทย / タイ語のコンテンツ

システムガイド 内容確認済み

การสร้าง API Key สำหรับ Authentication

บทนี้อธิบายถึงการสร้าง API Key เพื่อใช้ในการยืนยันตัวตน (Authentication) และควบคุมการเข้าถึง API โดยเน้นที่การสร้าง API Key อย่างง่ายด้วย `uniqid()` และการเก็บร...

การสร้าง 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() และเก็บไว้ในตัวแปร $apiKey
  • echo "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 ของเรา

Office.in.th Custom Service

この構成をもとにシステムを開発・カスタマイズしたいですか?

Office.in.th は、エンタープライズ Web アプリケーション、API 連携、官民の業務管理システムの設計・開発を承り、長期的なサポートも提供します。

ソフトウェア開発サービスを見る