JSON Web Token

Json Web Token (JWT) đang trở nên phổ biến hơn trong việc bảo mật API . Nhưng JWT thực sự là gì? Và nó hoạt động như thế nào? 

Đó là những gì tôi sẽ chia sẻ trong blog này. 

1. Json Web Token (JWT) là gì?

JWT , hay JSON Web Token, là một tiêu chuẩn mở được sử dụng để chia sẻ thông tin bảo mật giữa hai bên — máy khách (client) và máy chủ (server) thông qua một chuỗi JSON.  Thông tin giao dịch thông qua JWT sẽ được bảo mật và có độ tin tưởng cao nhờ vào chữ ký điện tử để xác minh tính toàn vẹn sở hữu. Chữ ký điện tử sử dụng mã khóa công khai/ riêng tư sử dụng RSA, ECDSA với thuật toán HMAC.

what is jwt

2. Cấu trúc của một Json Web Token

Dưới đây là 1 JSON Web Token

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJzdWIiOiJuaHMzMTA4IiwiZXhwIjoxNTU4MDYzODM3fQ.
449KVmOFWcpOUjnYGm-f1QWhY8N-DerKDfTK0JQm1Nc

Trông lằng nhằng thế thôi nhưng JWT có cấu trúc của nó đấy!!!

JWT bao gồm 3 phần, được phân cách bởi dấu chấm (.) và được mã hóa bằng Base64 URL:

  • Header (eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9): là phần chứa thuật toán mã hoá sử dụng ví dụ: HS256, HS512,… và token type.
  • Payload (eyJzdWIiOiJuaHMzMTA4IiwiZXhwIjoxNTU4MDYzODM3fQ): Phần chứa data.
  • Signature (449KVmOFWcpOUjnYGm-f1QWhY8N-DerKDfTK0JQm1Nc) : Chữ ký xác minh.
cấu trúc jwt

3. JWT hoạt động như thế nào?

Tạo JWT:

  • Server tạo một JWT bằng cách mã hóa các thông tin cần thiết vào header và payload, sau đó tạo chữ ký dựa trên header, payload và một khóa bí mật.
  • JWT được gửi đến client.

Xác thực JWT:

  • Client gửi JWT trở lại server trong các yêu cầu tiếp theo.
  • Server giải mã header và payload để lấy thông tin người dùng.
  • Server sử dụng cùng một khóa bí mật để tạo lại chữ ký và so sánh với chữ ký trong JWT nhận được.
  • Nếu hai chữ ký khớp, JWT được xác thực và server cho phép truy cập vào các tài nguyên tương ứng.
Cơ chế xác thực server - client

4. Ví dụ cơ chế đăng nhập tạo token và xác thực token bằng Laravel

Giới thiệu

Laravel cung cấp một cách dễ dàng để tích hợp JWT vào ứng dụng của bạn thông qua gói tymon/jwt-auth. Gói này cung cấp các lớp và helper để tạo, xác thực và làm tươi token JWT.

Cài đặt

composer require tymon/jwt-auth

Cấu hình

Sau khi cài đặt, bạn cần thực hiện một số cấu hình trong file .env của dự án:

JWT_SECRET=your_secret_key
JWT_TTL=60
  • JWT_SECRET: Khóa bí mật để tạo chữ ký cho token.
  • JWT_TTL: Thời gian sống của token tính bằng phút.

Tạo Migration và Model User

Nếu chưa có bảng users, bạn cần tạo migration và model:

php artisan make:migration create_users_table

Sửa file migration để thêm các trường cần thiết như name, email, password.

Cấu hình Provider

Đăng ký provider của gói JWT vào file config/app.php:

PHP

'providers' => [
    // ...
    Tymon\JWTAuth\Providers\LaravelServiceProvider::class,
]

Sử dụng Middleware

Để bảo vệ các route, bạn cần sử dụng middleware jwt.auth:

PHP

Route::group(['middleware' => 'jwt.auth'], function() {
    // Các route cần bảo vệ
    Route::get('user', function(Request $request) {
        return $request->user();
    });
});

Tạo và Xác thực Token

Tạo token khi người dùng đăng nhập:

PHP

use Tymon\JWTAuth\Facades\JWTAuth;

// ...

// Giả sử bạn đã xác thực thông tin đăng nhập
$token = JWTAuth::fromUser($user);

return response()->json(['token' => $token]);

Xác thực token trong các request:

PHP

use Tymon\JWTAuth\Facades\JWTAuth;

// ...

try {
    $user = JWTAuth::parseToken()->authenticate();
} catch (JWTException $e) {
    if ($e instanceof TokenInvalidException){
        // ...
    } else if ($e instanceof TokenExpiredException){
        // ...
    } else {
        // ...
    }
}

Ví dụ hoàn chỉnh

PHP

use Illuminate\Http\Request;
use Tymon\JWTAuth\Facades\JWTAuth;
use Tymon\JWTAuth\Exceptions\JWTException;
use Tymon\JWTAuth\Exceptions\TokenExpiredException;   
use Tymon\JWTAuth\Exceptions\TokenInvalidException;   

Route::post('/login', function(Request $request) {
    $credentials = $request->only('email', 'password');

    if (!$token = JWTAuth::attempt($credentials)) {
        return response()->json(['error'    => 'invalid_credentials'], 401);
    }

    return response()->json(['token'    => $token]);
});

Route::group(['middleware' => 'jwt.auth'], function() {
    Route::get('/user', function(Request $request) {
        return $request->user();
    });
});
Laravel use JWT

5. Khi nào nên dùng JWT?

  • Xác thực: phần lớn người dùng sử dụng JWT dùng để xác thực sau khi đăng nhập thành công, để tăng mức độ tiện dụng trong những lần xác thực kế tiếp cũng như tăng cường sự an toàn bảo mật.
  • Trao đổi, truyền đạt thông tin: để trao đổi thông tin an toàn giữa các bên thì JWT cũng là 1 giải pháp, phần signature (chữ ký) ở JWT cho phép bạn xác minh và định danh người gửi, dễ dàng phát hiện nếu có giả mạo. Bên cạnh đó cấu trúc JWT cũng giúp bạn biết nội dung đó có chính xác không.

Kết luận

Hy vọng qua blog này của mình sẽ giúp được cho các bạn hiểu thêm được về những kiến thức cơ bản JWT và cơ ché xác thực của server – client hoạt động như thế nào. Quan điểm của mình không có gì là hoàn hảo cả, giả sử trong trường hợp JWT của bạn bị đánh cắp thì lúc này kẻ đánh cắp vẫn có thể hoàn toàn sử dụng JWT của bạn,  vì thế để giảm thiểu khả năng thiệt hại JWT thường luôn có thời hạn sử dụng ở khoảng thời gian ngắn, sau khoảng thời gian trên mã JWT sẽ không còn hiệu lực. Mình mong rằng các bạn sẽ sử dụng hiệu quả hơn về JWT từ blog của mình. Các bạn có thể tham khảo thêm thông tin tại trang chủ của JWT: https://jwt.io/

Cảm ơn vì đã đọc hết bài viết này!!

Tham khảo các bài viết cùng chủ đề:

https://chiase4dev.com/authentication/tim-hieu-authentication-xac-thuc-nguoi-dung.html

Leave a Reply

Your email address will not be published. Required fields are marked *