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.
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.
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.
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();
});
});
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