Trong hướng dẫn này, bạn sẽ thấy cách tạo và xác thực JWT (Mã thông báo web JSON) bằng ngôn ngữ lập trình PHP mà không cần sử dụng bất kỳ thư viện hoặc plugin của bên thứ ba nào. Tôi sẽ không giải thích ở đây JWT là gì và tại sao JWT được sử dụng nhưng bạn có thể tìm thấy tài liệu tuyệt vời trên Trang web JWT của riêng mình
Ví dụ tạo và xác thực JWT này không sử dụng bất kỳ thư viện bên thứ ba nào và bạn có thể điều chỉnh mã nguồn theo nhu cầu của mình. Tôi sẽ đặt thời gian hết hạn trong quá trình tạo JWT vì lý do bảo mật để tránh hiệu lực vô thời hạn của mã thông báo được tạo. Và khi mã thông báo hết hạn, người dùng phải nhận mã thông báo mới. Đối với ví dụ này, tôi sẽ giữ thời gian hiệu lực của mã thông báo được tạo trong 60 giây
Để tạo JWT, bạn cần chủ yếu là tiêu đề, tải trọng và bí mật. Tiếp theo, bạn tạo chữ ký từ tiêu đề được mã hóa, tải trọng được mã hóa, bí mật, thuật toán được chỉ định trong tiêu đề
Các thuật toán mật mã điển hình được sử dụng là HMAC với chữ ký SHA-256 (HS256) và RSA với SHA-256 (RS256)
bài viết liên quan
- Xác thực PHP REST API bằng JWT
Tiêu đề JWT
Tiêu đề thường bao gồm hai phần. loại mã thông báo là JWT và thuật toán ký đang được sử dụng, chẳng hạn như HMAC SHA256 hoặc RSA
Ví dụ
{ "alg": "HS256", "typ": "JWT" }Sau đó, JSON này được mã hóa Base64Url để tạo thành phần đầu tiên của JWT
Tải trọng JWT
Phần thứ hai của mã thông báo là tải trọng, chứa các yêu cầu. Tuyên bố là tuyên bố về một thực thể (thường là người dùng) và dữ liệu bổ sung. Có ba loại khiếu nại. yêu cầu đã đăng ký, công khai và riêng tư. Để biết thêm thông tin về từng loại, bạn có thể đọc https. //jwt. io/giới thiệu/
Một tải trọng ví dụ có thể là
{ "sub": "1234567890", "name": "John Doe", "admin": true }Tải trọng sau đó được mã hóa Base64Url để tạo thành phần thứ hai của Mã thông báo web JSON
Chữ ký JWT
Ví dụ: nếu bạn muốn sử dụng thuật toán HMAC SHA256, chữ ký sẽ được tạo theo cách sau
HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)Chữ ký được sử dụng để xác minh thông báo không bị thay đổi trong quá trình thực hiện và trong trường hợp mã thông báo được ký bằng khóa riêng tư, nó cũng có thể xác minh rằng người gửi JWT chính là người được thông báo.
Bây giờ hãy xem cách tạo và xác thực JWT bằng ngôn ngữ PHP
điều kiện tiên quyết
PHP7. 3. 5 – 7. 4. 23
Tạo JWT
Đầu ra của JWT được tạo là ba chuỗi Base64-URL được phân tách bằng dấu chấm
function generate_jwt($headers, $payload, $secret = 'secret') { $headers_encoded = base64url_encode(json_encode($headers)); $payload_encoded = base64url_encode(json_encode($payload)); $signature = hash_hmac('SHA256', "$headers_encoded.$payload_encoded", $secret, true); $signature_encoded = base64url_encode($signature); $jwt = "$headers_encoded.$payload_encoded.$signature_encoded"; return $jwt; }Đây là định nghĩa hàm được mã hóa Base64-URL
function base64url_encode($str) { return rtrim(strtr(base64_encode($str), '+/', '-_'), '='); }Sau đây là một ví dụ về cách tạo JWT
$headers = array('alg'=>'HS256','typ'=>'JWT'); $payload = array('sub'=>'1234567890','name'=>'John Doe', 'admin'=>true, 'exp'=>(time() + 60)); $jwt = generate_jwt($headers, $payload); echo $jwt;Đầu ra của các đoạn mã trên là
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjEyMzQ1Njc4OTAiLCJuYW1lIjoiSm9obiBEb2UiLCJhZG1pbiI6dHJ1ZSwiZXhwIjoxNTgyNjE2MDA1fQ.umEYVDP_kZJGCI3tkU9dmq7CIumEU8Zvftc-klp-334Xác thực JWT
Bây giờ bạn đã tạo JWT ở bước trên. Đã đến lúc xác minh xem bạn có nhận được cùng một tiêu đề và tải trọng từ JWT hay không. Do đó, bạn sẽ cần xác thực JWT đã tạo của mình
function is_jwt_valid($jwt, $secret = 'secret') { // split the jwt $tokenParts = explode('.', $jwt); $header = base64_decode($tokenParts[0]); $payload = base64_decode($tokenParts[1]); $signature_provided = $tokenParts[2]; // check the expiration time - note this will cause an error if there is no 'exp' claim in the jwt $expiration = json_decode($payload)->exp; $is_token_expired = ($expiration - time()) < 0; // build a signature based on the header and payload using the secret $base64_url_header = base64url_encode($header); $base64_url_payload = base64url_encode($payload); $signature = hash_hmac('SHA256', $base64_url_header . "." . $base64_url_payload, $secret, true); $base64_url_signature = base64url_encode($signature); // verify it matches the signature provided in the jwt $is_signature_valid = ($base64_url_signature === $signature_provided); if ($is_token_expired || !$is_signature_valid) { return FALSE; } else { return TRUE; } }Sau đây là một ví dụ về xác thực JWT đã tạo
________số 8_______Thử nghiệm ứng dụng JWT
Tạo JWT bằng cách thực thi tệp jwt. php sử dụng CLI (giao diện dòng lệnh)
\php-jwt-generation-validation>php jwt.phpJWT được tạo ra được đưa ra dưới đây
{ "sub": "1234567890", "name": "John Doe", "admin": true }0Bây giờ sao chép JWT ở trên vào tệp jwt_valid. php
{ "sub": "1234567890", "name": "John Doe", "admin": true }1Cuối cùng thực hiện jwt_valid. tệp php bằng CLI
{ "sub": "1234567890", "name": "John Doe", "admin": true }2Bạn sẽ thấy đầu ra sau
{ "sub": "1234567890", "name": "John Doe", "admin": true }3JWT có giá trị trong 60 giây hoặc 1 phút. Bây giờ sau 1 phút nếu bạn kiểm tra tính hợp lệ của JWT ở trên, bạn sẽ nhận được giá trị không hợp lệ