Làm cách nào để xác thực JWT trong PHP?

Mã thông báo truy cập được ký bằng RS256, điều đó có nghĩa là JWT được ký bằng khóa riêng Azure AD và sẽ được xác thực bằng khóa chung Azure AD

Sau khi bạn nhận được mã thông báo truy cập bằng cách sử dụng điểm cuối mã thông báo, mã thông báo cần xác minh để xác thực tính xác thực của dữ liệu của mã thông báo JWT bằng cách sử dụng khóa chung của Azure AD để xác minh chữ ký. Bạn có thể lấy khóa chung bằng cách gọi điểm cuối cấu hình Azure AD OpenID công khai https. //đăng nhập. microsoftonline. com/{tenant-id}/v2. 0/. cấu hình nổi tiếng/openid và xác minh đối với khóa riêng (đứa trẻ) được tạo bởi mã thông báo Azure AD

Tôi không chắc chắn về cách triển khai trong PHP nhưng đã tìm thấy luồng tràn ngăn xếp để xác minh JWT bằng PHP

PHP-JWT là một gói được viết bằng ngôn ngữ lập trình PHP để mã hóa (tạo), giải mã (phân tích cú pháp), xác minh và xác thực JWT (Mã thông báo web JSON). Nó cung cấp một giao diện thông thạo, dễ sử dụng và hướng đối tượng

Xác nhận bởi JWT. io

Tài liệu

phiên bản

  • 2. x. x (LTS)
  • 1. x. x (Không được hỗ trợ)

JWT là gì?

Trong trường hợp bạn không quen với JWT, bạn có thể đọc Wikipedia hoặc JWT. io

Cài đặt

Thêm gói vào phần phụ thuộc Trình soạn thảo của bạn bằng lệnh sau

composer require miladrahimi/php-jwt "2.*"

ví dụ đơn giản

Ví dụ sau đây cho thấy cách tạo JWT và phân tích cú pháp bằng thuật toán HS256

use MiladRahimi\Jwt\Generator;
use MiladRahimi\Jwt\Parser;
use MiladRahimi\Jwt\Cryptography\Algorithms\Hmac\HS256;

// Use HS256 to generate and parse tokens
$signer = new HS256('12345678901234567890123456789012');

// Generate a token
$generator = new Generator($signer);
$jwt = $generator->generate(['id' => 666, 'is-admin' => true]);

// Parse the token
$parser = new Parser($signer);
$claims = $parser->parse($jwt);

print_r($claims); // ['id' => 666, 'is-admin' => true]

thuật toán HMAC

Thuật toán HMAC sử dụng khóa đối xứng. Một khóa duy nhất có thể ký và xác minh JWT. Gói này hỗ trợ HS256, HS384 và HS512 của thuật toán HMAC. Ví dụ được đề cập ở trên minh họa cách sử dụng thuật toán HMAC (HS256) để ký và xác minh JWT

Thuật toán RSA

Các thuật toán RSA không đối xứng. Cần có một khóa được ghép nối để ký và xác minh mã thông báo. Để ký JWT, chúng tôi sử dụng khóa riêng và để xác minh, chúng tôi sử dụng khóa chung có liên quan. Các thuật toán này có thể hữu ích khi máy chủ xác thực không thể tin tưởng chủ sở hữu tài nguyên. Hãy xem ví dụ sau

use MiladRahimi\Jwt\Cryptography\Algorithms\Rsa\RS256Signer;
use MiladRahimi\Jwt\Cryptography\Algorithms\Rsa\RS256Verifier;
use MiladRahimi\Jwt\Cryptography\Keys\RsaPrivateKey;
use MiladRahimi\Jwt\Cryptography\Keys\RsaPublicKey;
use MiladRahimi\Jwt\Generator;
use MiladRahimi\Jwt\Parser;

// Generate a token
$privateKey = new RsaPrivateKey('/path/to/private.pem');
$signer = new RS256Signer($privateKey);
$generator = new Generator($signer);
$jwt = $generator->generate(['id' => 666, 'is-admin' => true]);

// Parse the token
$publicKey = new RsaPublicKey('/path/to/public.pem');
$verifier = new RS256Verifier($publicKey);
$parser = new Parser($verifier);
$claims = $parser->parse($jwt);

print_r($claims); // ['id' => 666, 'is-admin' => true]

Bạn có thể đọc hướng dẫn này để tìm hiểu cách tạo một cặp khóa RSA (công khai/riêng tư)

Thẩm định

Theo mặc định, gói xác minh chữ ký JWT, xác thực một số xác nhận quyền sở hữu công khai nếu chúng tồn tại (sử dụng DefaultValidator) và phân tích cú pháp các xác nhận quyền sở hữu. Nếu bạn có xác nhận quyền sở hữu tùy chỉnh của mình, bạn cũng có thể thêm các quy tắc xác thực của chúng. Xem ví dụ này

use MiladRahimi\Jwt\Parser;
use MiladRahimi\Jwt\Cryptography\Algorithms\Hmac\HS256;
use MiladRahimi\Jwt\Exceptions\ValidationException;
use MiladRahimi\Jwt\Validator\Rules\EqualsTo;

$jwt = '...'; // Get the JWT from the user

$signer = new HS256('12345678901234567890123456789012');

// Add Validation (Extend the DefaultValidator)
$validator = new DefaultValidator();
$validator->addRule('is-admin', new EqualsTo(true));

// Parse the token
$parser = new Parser($signer, $validator);

try {
    $claims = $parser->parse($jwt);
    echo $claims; // ['id' => 666, 'is-admin' => true]
} catch (ValidationException $e) {
    // Handle error.
}

Trong ví dụ trên, chúng tôi đã mở rộng DefaultValidator. Trình xác thực này có một số Quy tắc tích hợp cho các khiếu nại công khai. Chúng tôi cũng khuyên bạn nên mở rộng nó để xác thực. DefaultValidator là một phân lớp của BaseValidator. Bạn cũng có thể sử dụng BaseValidator để xác thực, nhưng bạn sẽ mất Quy tắc tích hợp và bạn phải tự thêm tất cả Quy tắc

Quy tắc

Trình xác thực sử dụng Quy tắc để xác thực các xác nhận quyền sở hữu. Mỗi Quy tắc xác định các giá trị đủ điều kiện cho một xác nhận quyền sở hữu. Đây là các Quy tắc tích hợp sẵn mà bạn có thể tìm thấy trong không gian tên

use MiladRahimi\Jwt\Generator;
use MiladRahimi\Jwt\Parser;
use MiladRahimi\Jwt\Cryptography\Algorithms\Hmac\HS256;

// Use HS256 to generate and parse tokens
$signer = new HS256('12345678901234567890123456789012');

// Generate a token
$generator = new Generator($signer);
$jwt = $generator->generate(['id' => 666, 'is-admin' => true]);

// Parse the token
$parser = new Parser($signer);
$claims = $parser->parse($jwt);

print_r($claims); // ['id' => 666, 'is-admin' => true]
1

  • Bao gồm
  • Tương đương với
  • Lớn hơn
  • Lớn hơn hoặc bằng
  • giống hệt nhau
  • Ít hơn
  • Ít hơn hoặc bằng
  • Mới hơn
  • Mới hơnHoặcSame
  • Không có sản phẩm nào
  • Có giá trị
  • Lớn tuổi hơn
  • Cũ Hơn Hoặc Giống Nhau

Bạn có thể xem mô tả của họ trong khối tài liệu lớp học của họ

Quy tắc bắt buộc và tùy chọn

Bạn có thể thêm quy tắc vào trình xác thực theo yêu cầu hoặc tùy chọn. Nếu Quy tắc là bắt buộc, việc xác thực sẽ không thành công khi xác nhận quyền sở hữu liên quan không có trong xác nhận quyền sở hữu JWT

Ví dụ này minh họa cách thêm quy tắc theo yêu cầu và tùy chọn

$validator = new DefaultValidator();

// Add a rule as required
$validator->addRule('exp', new NewerThan(time()));

// Add a rule as required again!
$validator->addRule('exp', new NewerThan(time()), true);

// Add a rule as optional
$validator->addRule('exp', new NewerThan(time()), false);

Những nguyên tắc tập quán

Bạn tạo Quy tắc của riêng mình nếu quy tắc tích hợp không thể đáp ứng nhu cầu của bạn. Để tạo Quy tắc, bạn phải triển khai giao diện

use MiladRahimi\Jwt\Generator;
use MiladRahimi\Jwt\Parser;
use MiladRahimi\Jwt\Cryptography\Algorithms\Hmac\HS256;

// Use HS256 to generate and parse tokens
$signer = new HS256('12345678901234567890123456789012');

// Generate a token
$generator = new Generator($signer);
$jwt = $generator->generate(['id' => 666, 'is-admin' => true]);

// Parse the token
$parser = new Parser($signer);
$claims = $parser->parse($jwt);

print_r($claims); // ['id' => 666, 'is-admin' => true]
2 như ví dụ sau hiển thị Quy tắc
use MiladRahimi\Jwt\Generator;
use MiladRahimi\Jwt\Parser;
use MiladRahimi\Jwt\Cryptography\Algorithms\Hmac\HS256;

// Use HS256 to generate and parse tokens
$signer = new HS256('12345678901234567890123456789012');

// Generate a token
$generator = new Generator($signer);
$jwt = $generator->generate(['id' => 666, 'is-admin' => true]);

// Parse the token
$parser = new Parser($signer);
$claims = $parser->parse($jwt);

print_r($claims); // ['id' => 666, 'is-admin' => true]
3 sẽ kiểm tra xem yêu cầu đã cho có phải là số chẵn hay không

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

Xác thực mã thông báo mang được thực hiện bằng cách gửi mã thông báo bảo mật với mọi yêu cầu HTTP mà chúng tôi thực hiện tới máy chủ . Bạn có thể thực hiện xác thực vật mang với bất kỳ ngôn ngữ lập trình nào, kể cả PHP. Mã thông báo mang là một chuỗi mật mã không có ý nghĩa hoặc mục đích sử dụng nhưng trở nên quan trọng trong một hệ thống mã thông báo phù hợp.

JWT được xác thực như thế nào?

Khi máy chủ xác thực của bạn nhận được JWT đến, nó sẽ sử dụng phân đoạn tiêu đề và tải trọng của JWT đến và khóa cá nhân được chia sẻ để tạo chữ ký. Nếu chữ ký khớp, thì ứng dụng của bạn biết rằng JWT đến có thể được tin cậy .

Chúng ta có thể sử dụng JWT trong PHP không?

Trên thực tế, có một thư viện mà bạn có thể sử dụng cho nó. PHP-JWT . Chỉ cần chạy lệnh composer require firebase/php-jwt và bạn sẽ có thư viện sẵn sàng để sử dụng bên trong mã của mình.