×

Tạo và xác thực token JWT để bảo mật API trong PHP

Trong bối cảnh bảo mật API ngày càng quan trọng, việc sử dụng JSON Web Token (JWT) đã trở thành một giải pháp phổ biến. JWT cho phép xác thực và ủy quyền người dùng một cách hiệu quả, giúp bảo vệ dữ liệu và tài nguyên trong các ứng dụng web. Hãy cùng tìm hiểu cách tạo và xác thực JWT trong PHP.

JWT là gì?

JSON Web Token (JWT) là một tiêu chuẩn mở được sử dụng để chia sẻ thông tin an toàn giữa hai bên, thường là client và server. JWT bao gồm ba phần chính: Header, Payload và Signature.

  1. Header: Chứa thông tin về thuật toán mã hóa.
  2. Payload: Chứa dữ liệu thực, thường là thông tin người dùng và các claims (các khai báo quyền hạn).
  3. Signature: Được tạo ra bằng cách ký mã kết hợp dữ liệu từ Header và Payload với một mật khẩu bí mật.

Tạo JWT trong PHP

Đầu tiên, để tạo JWT trong PHP, bạn sẽ cần cài đặt thư viện firebase/php-jwt:

composer require firebase/php-jwt

Tiếp theo, tạo một tệp PHP để tạo JWT. Dưới đây là ví dụ minh họa:

<?php
require 'vendor/autoload.php';
use \Firebase\JWT\JWT;

$key = "example_key";  // Khóa bí mật để ký JWT
$issuedAt = time();
$expirationTime = $issuedAt + 60 * 60;  // JWT hết hạn sau 1 giờ
$payload = array(
    "iss" => "https://yourdomain.com",  // Nhà phát hành token
    "aud" => "https://yourdomain.com",  // Người nhận token
    "iat" => $issuedAt,  // Thời gian phát hành
    "exp" => $expirationTime,  // Thời gian hết hạn
    "data" => array(
        "id" => 1,
        "username" => "exampleUser"
    )
);

// Tạo JWT
$jwt = JWT::encode($payload, $key);
echo "JWT: " . $jwt;
?>

Xác thực JWT

Để xác thực JWT, bạn cũng sử dụng thư viện firebase/php-jwt. Dưới đây là cách để làm:

<?php
require 'vendor/autoload.php';
use \Firebase\JWT\JWT;

// JWT từ request (ví dụ: từ header Authorization Bearer JWT)
$jwt = $_SERVER['HTTP_AUTHORIZATION'];
$key = "example_key";

if ($jwt) {
    try {
        // Giải mã JWT
        $decoded = JWT::decode($jwt, $key, array('HS256'));
        // Truy xuất thông tin người dùng từ JWT
        print_r((array) $decoded->data);

    } catch (Exception $e) {
        // Xử lý lỗi nếu JWT không hợp lệ
        echo 'Lỗi: ' . $e->getMessage();
    }
} else {
    echo 'JWT không tồn tại!';
}
?>

Các phương pháp bảo mật khi sử dụng JWT

  1. Sử dụng HTTPS: Đảm bảo rằng tất cả các giao tiếp giữa client và server đều được mã hóa bằng HTTPS để ngăn chặn đánh cắp JWT.
  2. Hạn chế thời gian sống của JWT: Thiết lập thời gian hết hạn ngắn để giảm thiểu rủi ro nếu JWT bị lộ.
  3. Lưu trữ an toàn: Không lưu trữ JWT trong local storage hoặc session storage vì dễ bị tấn công XSS. Thay vào đó, sử dụng cookie HTTPOnly.
  4. Xoay khóa bí mật thường xuyên: Thay đổi khóa bí mật định kỳ để tăng cường bảo mật.

Việc tạo và xác thực JWT trong PHP không quá phức tạp, nhưng đòi hỏi sự cẩn thận trong các bước thực hiện và triển khai. Qua bài viết này, hy vọng bạn đã có cái nhìn tổng quan và hiểu rõ hơn về cách bảo mật API bằng JWT trong PHP.

Comments