Làm cách nào để xác thực mã thông báo mang trong PHP?

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 đề

Làm cách nào để xác thực mã thông báo mang trong PHP?

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-334

Xá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.php

JWT được tạo ra được đưa ra dưới đây

{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true
}
0

Bây giờ sao chép JWT ở trên vào tệp jwt_valid. php

{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true
}
1

Cuối cùng thực hiện jwt_valid. tệp php bằng CLI

{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true
}
2

Bạn sẽ thấy đầu ra sau

{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true
}
3

JWT 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ệ

Làm cách nào để kiểm tra mã thông báo mang trong PHP?

Để gửi yêu cầu GET có tiêu đề ủy quyền Mã thông báo mang bằng PHP, bạn cần phải thực hiện yêu cầu HTTP GET và cung cấp Mã thông báo gửi của bạn cùng với Ủy quyền. Tiêu đề HTTP {token} của người mang .

Làm cách nào để xác thực mã thông báo truy cập trong PHP?

Sử dụng JWT cho Mã thông báo truy cập trong PHP . Giải mã mã thông báo truy cập ở định dạng Mã thông báo web JSON. Xác minh chữ ký được sử dụng để ký mã thông báo truy cập.

Tính hợp lệ của mã thông báo mang là gì?

Mã thông báo mang hợp lệ (với các thuộc tính access_token hoặc refresh_token đang hoạt động) giữ cho xác thực của người dùng tồn tại mà không yêu cầu họ nhập lại thông tin đăng nhập của họ thường xuyên. Access_token có thể được sử dụng cho miễn là nó đang hoạt động, tối đa một giờ sau khi đăng nhập hoặc gia hạn .

Làm cách nào tôi có thể tự động nhận mã thông báo mang?

Người đưa thư tự động .
Thẻ ủy quyền. Trong Tab ủy quyền, hãy đặt Loại thành Mã thông báo mang và đối với giá trị của Mã thông báo, hãy đặt biến của bạn, tôi đã sử dụng {{BEARERTOKEN}}
Thẻ tập lệnh yêu cầu trước. Trong Tab Tập lệnh yêu cầu trước, đây là nơi điều kỳ diệu xảy ra. .
Yêu cầu thiết lập