Hướng dẫn can i use jwt with php? - tôi có thể sử dụng jwt với php không?

Bảo mật đã trở thành một khía cạnh cơ bản để xem xét trong khi phát triển một ứng dụng. Khi mọi người nhận thức rõ hơn và tin tặc khét tiếng hơn, bạn cần sử dụng các hệ thống tăng cường bảo mật dữ liệu của ứng dụng.

Trước đây, thông thường sử dụng lưu trữ phiên để bảo mật các ứng dụng. Trong thời gian gần đây, các phiên đã tỏ ra không hiệu quả, đã thúc đẩy di chuyển để xác thực với API. Mặc dù đây là một cách tuyệt vời và mạnh mẽ để bảo mật các ứng dụng web, nhưng nó đã trở nên lỗi thời khi các tin tặc cố gắng tìm ra cách bẻ khóa xác thực này.

Khi web phát triển để chấp nhận ngày càng nhiều người dùng, nghiên cứu về các kỹ thuật xác thực an toàn tăng tốc. Năm 2010, thế giới đã được giới thiệu một tiêu chuẩn xác thực mới và an toàn - JWT. Hãy biết thêm về JWT.

JWT là gì?

JSON Web Token (JWT) là một cách an toàn để xác thực người dùng trên một ứng dụng web. Sử dụng JWT, bạn có thể chuyển một cách an toàn dữ liệu và thông tin được mã hóa giữa máy khách và máy chủ.

Tìm hiểu thêm về sự khác biệt giữa các phiên và JWT ở đây.

JWT cung cấp nhiều lợi ích. Dưới đây là một số trong số họ.

Lợi ích của việc sử dụng JWT

  • Tương thích với OAuth 2, có nghĩa là các ứng dụng của bạn sẽ dễ dàng làm việc với các tiêu chuẩn bảo mật mới nhất.
  • JWTS có thể hết hạn sau một thời gian để không ai có quyền truy cập không bị gián đoạn vào trang web. Điều này rất quan trọng để bảo vệ một trang web khỏi các cuộc tấn công.
  • JSON được sử dụng để truyền dữ liệu, vì vậy bạn có thể làm việc với bất kỳ ngôn ngữ nào bạn chọn và xử lý dữ liệu JSON.
  • JWT là giàu tính năng và bao gồm thông tin đầy đủ về bất kỳ yêu cầu ủy quyền nào với các khía cạnh khác nhau.

Bây giờ bạn đã học được về những lợi thế, đã đến lúc đi sâu hơn vào JWT.

Cấu trúc của JWT

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
  .eyJpc3MiOiJodHRwczpcL1wvcWEtYXBpLndlbGx2aWJlLmNvbVwvYXBpXC9hdXRoXC9sb2dpbiIsImlhdCI6MTYzMDQ3OTA5NSwiZXhwIjoxNjMwNDgyNjk1LCJuYmYiOjE2MzA0NzkwOTUsImp0aSI6Imtsa3hHUGpMOVlNTzRSdUsiLCJzdWIiOjc3ODE4LCJwcnYiOiIyM2JkNWM4OTQ5ZjYwMGFkYjM5ZTcwMWM0MDA4NzJkYjdhNTk3NmY3IiwidXNlcnNfaWQiOjc3ODE4LCJtZW1iZXJzX2lkIjo3Nzg4MzMsInByb3h5X3VzZXJfbWVtYmVyc19pZCI6bnVsbH0
  .TxXwLLu1zWBe7cLLYdFYy3P2HX4AaLgc7WfSRtTgeiI

Chuỗi trên là một ví dụ về chuỗi xác thực JWT. Thoạt nhìn, nó có vẻ là một chuỗi được sản xuất ngẫu nhiên. Nhưng đừng đánh giá thấp; Chuỗi này được tạo thành từ ba thành phần riêng biệt cần thiết trong JWT.

Tiêu đề của JWT là phần ban đầu của chuỗi trước dấu chấm đầu tiên. Tiêu đề này được sản xuất bằng cách có được văn bản đơn giản và thực hiện các hoạt động mật mã trên đó. Hơn nữa, tiêu đề sử dụng quy trình mã hóa Base64 rất hiệu quả.

Bạn có thể nhanh chóng có được các tiêu đề của JWT bằng các kỹ thuật mã hóa đối xứng hoặc không đối xứng.

Tải trọng JWT

Thành phần trung tâm của chuỗi là phần tải trọng của JWT. Chuỗi này bao gồm tất cả các thông tin quan trọng về một yêu cầu nhận được và người dùng hoặc máy tính máy tính đã tạo yêu cầu. Có các trường cặp giá trị khóa được xác định trước trong tải trọng có thể được sử dụng để cung cấp thêm thông tin về yêu cầu nhận được. Dưới đây là một lời giải thích về các trường tải trọng chung.

  • Sub - Trường con chứa chủ đề của tải trọng JWT. Nó chứa thông tin duy nhất về người dùng và thiết bị khách đã tạo yêu cầu xác thực này. - The sub field contains the subject of a JWT payload. It contains unique information about the user and client device that has created this authentication request.
  • ISS - Trường này chứa dữ liệu về máy chủ đã phát hành mã thông báo. ISS là viết tắt của nhà phát hành, trong đó đề cập đến máy chủ. - This field contains data about the server that has issued the token. Iss is short for Issuer, which refers to the server.
  • EXP - Không giống như các kỹ thuật xác thực khác, JWT có thời gian hết hạn. Tên trường này là một hình thức ngắn cho ngày hết hạn. Nó chứa dữ liệu về thời điểm mã thông báo được phát hành và ngày và thời gian hết hạn của mã thông báo được phát hành. - Unlike other authentication techniques, JWT has an expiration time. This field's name is a short form for the expiration date. It contains data about when the token was issued and the expiration date and time of the issued token.

Chữ ký JWT

Một hoạt động mật mã được thực hiện trên dữ liệu JWT để có được chữ ký này. Nó mất vào tải trọng, khóa bí mật và giá trị tiêu đề của JWT. Chữ ký sau đó được tạo ra bằng cách áp dụng một hàm cho các giá trị thu được này.

Máy chủ và người dùng có thể xác minh chữ ký này để biết về tính bảo mật và tính toàn vẹn của dữ liệu. Nếu chữ ký này khớp ở cả hai đầu, thì dữ liệu được coi là an toàn và tất cả các giao dịch khác có thể xảy ra.

Sử dụng JWTS để bảo mật API PHP

Như bạn đã hiểu mọi thứ về JWT, hãy bảo mật API PHP của bạn bằng JWT. Thực hiện theo mã theo, và cuối cùng, bạn sẽ tạo API PHP chống giả mạo.

Bài viết này tạo ra một trang đăng nhập đơn giản và xác thực nó bằng JWT. Điều này sẽ giúp bạn bắt đầu với JWT và PHP.

Để theo dõi, bạn sẽ cần cài đặt PHP và nhà soạn nhạc trên máy tính của bạn.

Nếu bạn chưa cài đặt trình soạn thảo trên máy tính, bạn có thể tìm hiểu cách cài đặt trình soạn thảo tại đây. Khi bạn đã cài đặt trình soạn thảo, hãy chạy công cụ từ thư mục dự án của bạn. Nhà soạn nhạc sẽ hỗ trợ bạn cài đặt Firebase PHP-JWT, thư viện của bên thứ ba để làm việc với JWTS và Apache.

Sau khi thư viện được cài đặt, bạn sẽ cần thiết lập mã đăng nhập trong


declare(strict_types=1);
use Firebase\JWT\JWT;
require_once('../vendor/autoload.php');
1. Trong khi bạn làm điều này, hãy đặt một đoạn mã kiểm tra và nhận trình tải tự động từ công cụ nhà soạn nhạc. Mã dưới đây giúp bạn đạt được điều này.


declare(strict_types=1);
use Firebase\JWT\JWT;
require_once('../vendor/autoload.php');

Khi biểu mẫu được gửi, bạn cần kiểm tra dữ liệu đã nhập bằng nguồn dữ liệu hoặc cơ sở dữ liệu. Với mục đích của chúng tôi, chúng ta hãy tạo một biến


declare(strict_types=1);
use Firebase\JWT\JWT;
require_once('../vendor/autoload.php');
2 và đặt nó thành True. Đặt biến này thành True có nghĩa là dữ liệu được kiểm tra và hợp lệ.


// extract credentials from the request
if ($hasValidCredentials) {

Bất kỳ mã hóa nào nữa sẽ được bọc trong khối này. Giá trị của biến


declare(strict_types=1);
use Firebase\JWT\JWT;
require_once('../vendor/autoload.php');
2 chi phối tất cả các mã liên quan đến việc sản xuất và xác nhận JWT cần thiết. Nếu giá trị của nó là đúng, JWT sẽ được tạo ra; Nếu không, một lỗi sẽ được hiển thị.

Tạo JWT

Hãy bắt đầu tạo JWT. Đầu tiên, bạn cần tạo thêm một số biến để hỗ trợ trong quá trình này. Như bạn đã thấy trong phần tải trọng, bạn phải tạo:

  • một biến sẽ giữ khóa bí mật, có thể được lấy từ các tệp môi trường;
  • Một biến khác để giữ thông tin về khi JWT được tạo;
  • một biến sẽ giữ ngày và giờ hết hạn của JWT;
  • một trường tên người dùng để xác định khách hàng thực hiện yêu cầu ủy quyền; và,
  • một biến tên máy chủ để đăng ký tên máy chủ.

JWT có thể dễ dàng kiểm tra và kiểm tra tại các trình duyệt phía máy khách. Vì vậy, tốt hơn là ẩn khóa bí mật của bạn và các thông tin quan trọng khác trong một số tệp môi trường mà người dùng không thể truy cập thông qua các yêu cầu phía máy khách.

$secret_Key  = '68V0zWFrS72GbpPreidkQFLfj4v9m3Ti+DXc8OB0gcM=';
$date   = new DateTimeImmutable();
$expire_at     = $date->modify('+6 minutes')->getTimestamp();      // Add 60 seconds
$domainName = "your.domain.name";
$username   = "username";                                           // Retrieved from filtered POST data
$request_data = [
    'iat'  => $date->getTimestamp(),         // Issued at: time when the token was generated
    'iss'  => $domainName,                       // Issuer
    'nbf'  => $date->getTimestamp(),         // Not before
    'exp'  => $expire_at,                           // Expire
    'userName' => $username,                     // User name
];

Bây giờ bạn có tất cả các dữ liệu cần thiết trong tay; Bạn có thể dễ dàng tạo một JWT. Tại đây, bạn sẽ sử dụng phương thức


declare(strict_types=1);
use Firebase\JWT\JWT;
require_once('../vendor/autoload.php');
4 của gói PHP-JWT. Phương pháp này giúp chuyển đổi mảng dữ liệu của bạn thành một đối tượng JSON.

Sau khi chuyển đổi sang đối tượng JSON, chức năng mã hóa tạo ra các tiêu đề JWT và dấu hiệu tải trọng nhận được với sự kết hợp mật mã của tất cả các thông tin và khóa bí mật đã cho.

Điều cần thiết là cung cấp ba đối số cho phương pháp


declare(strict_types=1);
use Firebase\JWT\JWT;
require_once('../vendor/autoload.php');
4 để sử dụng nó một cách chính xác. Đối số đầu tiên phải là thông tin tải trọng, đó là mảng dữ liệu trong trường hợp này. Thứ hai, bạn phải cung cấp khóa bí mật như một đối số; Và cuối cùng, bạn phải xác định kỹ thuật mật mã mà chức năng nên sử dụng để ký hợp đồng với JWT.

Để có được và trả về JWT, bạn sẽ phải sử dụng phương thức Echo phía trên phương thức mã hóa, như được hiển thị bên dưới.


    // Encode the array to a JWT string.
    echo JWT::encode(
        $request_data,
        $secret_Key,
        'HS512'
    );
}

Bây giờ bạn đã nhận được mã thông báo JWT, bạn có thể chuyển nó sang phía máy khách và lưu nó bằng bất kỳ ngôn ngữ lập trình web nào bạn chọn. Hãy bắt đầu với một cuộc biểu tình ngắn của JS về tuyến đường phía trước.

Đầu tiên, khi một bản gửi biểu mẫu thành công diễn ra, hãy lưu và nhận JWT đã tạo và nhận được trong bộ nhớ phía máy khách. Để hiển thị một số đầu ra về thành công của JWT, hãy xóa biểu mẫu đăng nhập và chỉ hiển thị một nút truy xuất và hiển thị dấu thời gian của JWT cho người dùng khi được nhấp.

Dưới đây là một số mã mẫu cho quá trình được đề cập ở trên.

const storeJWT = {}
const loginBtn = document.querySelector("#frmLogin")
const btnResource = document.querySelector("#btnGetResource")
const formData = document.forms[0]

// Inserts the jwt to the store object
storeJWT.setJWT = function (data) {
  this.JWT = data
}

loginBtn.addEventListener("submit", async e => {
  e.preventDefault()

  const response = await fetch("/authenticate.php", {
    method: "POST",
    headers: {
      "Content-type": "application/x-www-form-urlencoded; charset=UTF-8",
    },
    body: JSON.stringify({
      username: formData.inputEmail.value,
      password: formData.inputPassword.value,
    }),
  })

  if (response.status >= 200 && response.status <= 299) {
    const jwt = await response.text()
    storeJWT.setJWT(jwt)
    frmLogin.style.display = "none"
    btnResource.style.display = "block"
  } else {
    // Handle errors
    console.log(response.status, response.statusText)
  }
})

Bạn đã sản xuất và gửi JWT cho người dùng. Vì vậy, bây giờ đã đến lúc đưa JWT sử dụng ở phía người dùng.

Sử dụng JWT

Như đã nêu trước đây, nếu việc gửi biểu mẫu thành công, bạn sẽ hiển thị một nút để có được dấu thời gian. Nút này sẽ gọi phương thức GET trên tập lệnh


declare(strict_types=1);
use Firebase\JWT\JWT;
require_once('../vendor/autoload.php');
6. Kịch bản

declare(strict_types=1);
use Firebase\JWT\JWT;
require_once('../vendor/autoload.php');
6 sau đó sẽ đặt JWT nhận được sau khi xác thực thành công trong tiêu đề xác thực.

Mã sau đây sẽ giúp bạn đạt được kỳ tích này.

btnResource.addEventListener("click", async e => {
  const result = await fetch("/resource.php", {
    headers: {
      Authorization: `Bearer ${storeJWT.JWT}`,
    },
  })
  const timeStamp = await result.text()
  console.log(timeStamp)
})

Khi bạn đã viết mã này, hãy chạy chương trình và nhập thông tin đăng nhập của bạn vào các trường biểu mẫu. Yêu cầu GET sẽ được gửi khi bạn nhấp vào nút Gửi. Dưới đây là một mẫu nhận yêu cầu để hỗ trợ bạn trong việc nhận dạng chính xác.

GET /resource.php HTTP/1.1
Host: yourhost.com
Connection: keep-alive
Accept: */*
X-Requested-With: XMLHttpRequest
Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczpcL1wvcWEtYXBpLndlbGx2aWJlLmNvbVwvYXBpXC9hdXRoXC9sb2dpbiIsImlhdCI6MTYzMDQ3OTA5NSwiZXhwIjoxNjMwNDgyNjk1LCJuYmYiOjE2MzA0NzkwOTUsImp0aSI6Imtsa3hHUGpMOVlNTzRSdUsiLCJzdWIiOjc3ODE4LCJwcnYiOiIyM2JkNWM4OTQ5ZjYwMGFkYjM5ZTcwMWM0MDA4NzJkYjdhNTk3NmY3IiwidXNlcnNfaWQiOjc3ODE4LCJtZW1iZXJzX2lkIjo3Nzg4MzMsInByb3h5X3VzZXJfbWVtYmVyc19pZCI6bnVsbH0.TxXwLLu1zWBe7cLLYdFYy3P2HX4AaLgc7WfSRtTgeiI

Xác thực JWT

Nếu bạn đã theo dõi cho đến đây, mọi thứ sẽ hoạt động tốt. Bây giờ, hãy bắt đầu với việc xác thực JWT.

Để nhận trợ giúp với thao tác này, trước đây bạn đã thêm chức năng AutoLoader của nhà soạn nhạc. Bây giờ bạn sẽ sử dụng chức năng


declare(strict_types=1);
use Firebase\JWT\JWT;
require_once('../vendor/autoload.php');
8 để trích xuất mã thông báo từ tiêu đề của người mang. Để trích xuất này, bạn sẽ sử dụng chức năng

declare(strict_types=1);
use Firebase\JWT\JWT;
require_once('../vendor/autoload.php');
8 và cung cấp một biểu thức chính quy.

if (! preg_match('/Bearer\s(\S+)/', $_SERVER['HTTP_AUTHORIZATION'], $matches)) {
    header('HTTP/1.0 400 Bad Request');
    echo 'Token not found in request';
    exit;
}

Mã trên cố gắng trích xuất mã thông báo từ tiêu đề của người mang. Trong trường hợp này, xử lý lỗi được sử dụng. Do đó, nếu không phát hiện ra mã thông báo, lỗi HTTP 404 được hiển thị cho người dùng.

Để xác thực JWT, trước tiên bạn phải so sánh nó với JWT được tạo trước đó.

$jwt = $matches[1];
if (! $jwt) {
    // No token was able to be extracted from the authorization header
    header('HTTP/1.0 400 Bad Request');
    exit;
}

JWT được trích xuất được lưu tại chỉ số đầu tiên của mảng trận đấu. Nếu mảng phù hợp trống, điều đó có nghĩa là không có JWT nào được trích xuất. Nếu mã trước chạy thành công, nó ngụ ý rằng JWT đã được trích xuất và bây giờ bạn có thể tiến hành.

Giải mã dữ liệu nhận được là bắt buộc để xác minh JWT. Chỉ khóa bí mật có thể được sử dụng để giải mã dữ liệu nhận được. Khi bạn đã có được khóa bí mật, bạn có thể sử dụng chức năng giải mã tĩnh của mô-đun PHP-JWT.

Phương pháp giải mã yêu cầu ba đối số, như sau.

  • Chính JWT
  • Khóa bí mật
  • Thuật toán được sử dụng để giải mã JWT

Nếu phương thức giải mã thành công, bạn có thể tiến hành xác thực JWT. Mã dưới đây sẽ hỗ trợ bạn giải mã và xác nhận JWT.


declare(strict_types=1);
use Firebase\JWT\JWT;
require_once('../vendor/autoload.php');
0

Mã này sẽ cung cấp tất cả các tham số cần thiết cho hàm giải mã và lưu kết quả của phương thức. Sau đó, để ngăn chặn truy cập trái phép, việc xử lý lỗi được sử dụng. Nếu bất kỳ trường nào trong JWT không khả dụng, lỗi HTTP 401 cho biết truy cập trái phép sẽ được cấp cho người dùng.

Xác thực đăng nhập cho các ứng dụng PHP

Thay vì sử dụng quy trình được thảo luận ở trên, bạn có thể sử dụng nền tảng nhận dạng LoginRadius để xác thực API PHP của mình một cách nhanh chóng. Bạn có thể bắt đầu bằng cách tham khảo tài liệu Php Loginradius.

Ngoài ra, bạn có thể sử dụng SDK Php Loginradius để thêm đăng nhập đơn xã hội (SSO), từ đó, đơn giản hóa việc đăng ký và đăng nhập cho người dùng của bạn bằng cách loại bỏ nhu cầu ghi nhớ thêm một bộ thông tin đăng nhập cho ứng dụng của bạn.

Sự kết luận

Trong hướng dẫn này, bạn đã tìm hiểu về JWT. Sau đó, tạo một ứng dụng web PHP và bảo mật nó với xác thực JWT.

Bạn hiểu mức độ dễ dàng và quan trọng của một ứng dụng web.

Bạn có thể tìm thấy mã hoàn chỉnh được sử dụng trong hướng dẫn này ở đây.

Đừng quên thử điều này cho các dự án quan trọng hơn của bạn.

Cuối cùng, nếu bạn phải đối mặt với bất kỳ vấn đề nào theo hướng dẫn này hoặc có câu hỏi, xin vui lòng bình luận bên dưới. Chúng tôi sẽ trả lời ngay khi có thể để làm rõ câu hỏi của bạn.

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

Tại đây, bạn sẽ sử dụng phương thức mã hóa của gói PHP-JWT (). Phương pháp này giúp chuyển đổi mảng dữ liệu của bạn thành một đối tượng JSON. Sau khi chuyển đổi sang đối tượng JSON, chức năng mã hóa tạo ra các tiêu đề JWT và dấu hiệu tải trọng nhận được với sự kết hợp mật mã của tất cả các thông tin và khóa bí mật đã cho.use the PHP-JWT package's encode() method. This method helps transform your data array into a JSON object. Following the conversion to a JSON object, the encode function produces JWT headers and signs the received payload with a cryptographic combination of all the information and the given secret key.

Làm thế nào mã hóa JWT trong PHP?

Cách xây dựng mã thông báo web JSON trong PHP..
Tạo tiêu đề và tải trọng.Để bắt đầu, chúng ta cần tạo các chuỗi JSON tiêu đề và tải trọng.....
Tạo tiêu đề Base64URL và chuỗi tải trọng.....
Tạo chữ ký.....
Base64url mã hóa chữ ký.....
Tạo mã thông báo web JSON ..

Khi nào bạn không nên sử dụng JWT?

Lý do để tránh JWT đi xuống một vài điểm khác nhau:..
Thông số kỹ thuật JWT chỉ được thiết kế đặc biệt cho các mã thông báo rất ngắn (~ 5 phút hoặc ít hơn).....
JWTS chỉ lưu trữ mã thông báo phiên đơn giản là không hiệu quả và kém linh hoạt hơn so với cookie phiên thông thường và không đạt được bất kỳ lợi thế nào ..

Những nhược điểm của việc sử dụng JWT là gì?

Một trong những nhược điểm chính của việc dựa vào mã thông báo là nó chỉ dựa vào một chìa khóa.Có, JWT chỉ sử dụng một khóa, nếu được xử lý kém bởi nhà phát triển/quản trị viên, sẽ dẫn đến những hậu quả nghiêm trọng có thể ảnh hưởng đến thông tin nhạy cảm.it relies on just one key. Yes, JWT uses only one key, which if handled poorly by a developer/administrator, would lead to severe consequences that can compromise sensitive information.