JWTPHP

Pacman là một tiện ích quản lý các gói phần mềm trong Linux. Nó sử dụng các tệp nén đơn giản làm định dạng gói và duy trì cơ sở dữ liệu gói dựa trên văn bản (nhiều hệ thống phân cấp hơn), đề phòng trường hợp cần phải chỉnh sửa thủ công. Pacman không phấn đấu để "làm mọi thứ. " Nó sẽ thêm, xóa và

Xem phần mềm

  • chở hàng

    Cargo là trình quản lý gói Rust. Cargo tải xuống các phần phụ thuộc của gói Rust của bạn, biên dịch các gói của bạn, tạo các gói có thể phân phối và tải chúng lên thùng. io, sổ đăng ký gói của cộng đồng Rust. Bạn có thể đóng góp cho cuốn sách này trên GitHub. Để bắt đầu với Cargo, hãy cài đặt Cargo

    Xem phần mềm

  • Trình quản lý gói Fortran

    Trình quản lý gói và xây dựng hệ thống cho Fortran. Đã có sẵn nhiều gói để sử dụng với fpm, cung cấp một hệ sinh thái phong phú và dễ truy cập gồm mã hiệu suất cao và mục đích chung. Fortran Package Manager (fpm) là trình quản lý gói và xây dựng hệ thống cho Fortran. Mục tiêu chính của nó

    Gần đây tôi muốn tìm hiểu thêm về JSON Web Tokens (JWT) và cách chúng hoạt động. Tôi đã tìm thấy một số ví dụ phía máy chủ và một số ví dụ phía máy khách, nhưng thực sự chưa bao giờ tìm thấy một nơi nào minh họa toàn bộ chu trình. Vì vậy, tôi đã tạo của riêng mình và tôi đang chia sẻ nó ở đây

    Trước đây, tôi đã quản lý bảo mật bằng cách sử dụng các biến phiên PHP, đây là một phương pháp có một vài nhược điểm. Đầu tiên, nó yêu cầu một số quản lý phía máy chủ nếu bạn đang cân bằng tải cho nhiều máy chủ web. Có thể bạn sẽ cần triển khai giải pháp bộ nhớ đệm như Redis hoặc Memcache và xác định máy chủ bộ nhớ đệm để lưu trữ các phiên. Thứ hai, về phía máy khách, PHP lưu trữ cookie phiên có thể cho phép hiển thị thông tin biến phiên được sử dụng trong sơ đồ xác thực của bạn

    JWT giải quyết vấn đề này bằng cách sử dụng mã thông báo được tạo trên máy chủ và chứa thông tin cụ thể về ứng dụng xác thực được băm và mã hóa. Sau đó, mã thông báo này được trả lại cho khách hàng, khách hàng có thể sử dụng mã thông báo này với các yêu cầu API trong tương lai và không yêu cầu xác thực thêm

    Sự cố JWT

    JWT được xây dựng với ba thành phần. tiêu đề, tải trọng và chữ ký

    Tiêu đề chứa thông tin về thuật toán nào đã được sử dụng để băm mã thông báo. Trong ví dụ của chúng tôi, chúng tôi sẽ sử dụng HMAC-SHA256, một thuật toán sử dụng khóa bí mật

    Tải trọng (còn được gọi là yêu cầu của mã thông báo) chứa dữ liệu được lưu trữ bên trong mã thông báo. Trong ví dụ của chúng tôi, chúng tôi sẽ lưu trữ id người dùng của người dùng được xác thực trong tải trọng. Mặc dù chúng tôi sẽ chỉ lưu trữ một mục trong tải trọng, nhưng bạn có thể lưu trữ bao nhiêu yêu cầu tùy thích. Chỉ cần lưu ý rằng bạn nên xem xét hiệu suất khi làm như vậy và hãy nhớ rằng mã thông báo không nhằm mục đích là phương tiện để truyền yêu cầu dữ liệu mà thay vào đó chỉ là một công cụ được sử dụng để xác thực yêu cầu dữ liệu

    Trong ví dụ của chúng tôi, id người dùng trong mã thông báo có thể được sử dụng trên máy chủ làm khóa chỉ mục để truy vấn thông tin dành riêng cho người dùng được xác thực trong các yêu cầu tiếp theo mà không yêu cầu người dùng xác định lại chính họ — ví dụ: điều hướng người dùng đến một trang

    Ngoài ra còn có một số khiếu nại tiêu chuẩn có thể được bao gồm trong tải trọng, chẳng hạn như exp (ngày và giờ hết hạn) và nbf (không trước ngày và giờ), xác định thời gian mà JWT sẽ bắt đầu được chấp nhận để xử lý. Ví dụ của chúng tôi sẽ bao gồm khả năng bao gồm expnbf trong thử nghiệm của bạn. Bạn có thể xem trang Wikipedia về JWT để đọc về các trường tiêu chuẩn khác

    Chữ ký là biểu diễn được băm của tiêu đề và tải trọng. Tiêu đề và tải trọng được mã hóa base64url tương ứng và sau đó được nối với nhau bằng một period header.payload thành một biến mới. Biến đó sau đó được băm, trong trường hợp của chúng tôi là sử dụng thuật toán HS256 với khóa bí mật, thành một biến mới, biến này sau đó cũng được mã hóa base64url thành chữ ký. Chữ ký được thêm vào các biến tiêu đề và tải trọng với một khoảng thời gian khác header.payload.signature thành một biến cuối cùng là mã thông báo của chúng tôi, được chuyển lại cho khách hàng

    Và đó là cách nó hoạt động. Có rất nhiều bài viết giải thích điều này, nhưng ít nhất chúng tôi đã tạo tiền đề cho ví dụ của mình. Hãy đi sâu vào nó

    Thí dụ

    Ví dụ của tôi sử dụng ba tệp có thể được tải xuống miễn phí từ kho lưu trữ của tôi

    mục lục. html

    Đây là một trang đích đơn giản cung cấp các nút minh họa các ví dụ khác nhau về cách tương tác với tệp

    $nbf = strtotime('2021-01-01 00:00:01');

    $exp = strtotime('2021-01-01 00:00:01');
    0 trên máy chủ

    • Đăng nhập tốt — gửi POST với tên người dùng là john. nai và mật khẩu của foobar. Nếu xác thực thành công, mã thông báo sẽ được trả lại. Khách hàng có thể quyết định cách họ muốn lưu trữ mã thông báo để sử dụng trong tương lai. Trong trường hợp của chúng tôi, chúng tôi sẽ lưu trữ nó trong trình duyệt
      $nbf = strtotime('2021-01-01 00:00:01');

      $exp = strtotime('2021-01-01 00:00:01');
      1
    • Đăng nhập không hợp lệ — gửi POST với tên người dùng là john. doe và mật khẩu không hợp lệ của foobafoobar. Điều này sẽ khiến
      $nbf = strtotime('2021-01-01 00:00:01');

      $exp = strtotime('2021-01-01 00:00:01');
      2 từ chối nỗ lực xác thực có lỗi và không có mã thông báo. Khi nhận được lỗi, khách hàng sẽ xóa mọi mã thông báo hiện có và người dùng sẽ được yêu cầu nhận mã thông báo mới bằng cách sử dụng nút Đăng nhập tốt trước khi mọi thử nghiệm tiếp theo hoạt động
    • Kiểm tra nếu đã đăng nhập — sẽ phát hành GET bằng cách sử dụng mã thông báo được lưu trữ trong
      $nbf = strtotime('2021-01-01 00:00:01');

      $exp = strtotime('2021-01-01 00:00:01');
      1. Nếu thành công,
      $nbf = strtotime('2021-01-01 00:00:01');

      $exp = strtotime('2021-01-01 00:00:01');
      2 sẽ trả lại id người dùng mà chúng tôi đã lưu trữ trong tải trọng của mã thông báo
    • Đăng xuất và xóa mã thông báo — chỉ cần xóa bất kỳ mã thông báo hiện có nào khỏi
      $nbf = strtotime('2021-01-01 00:00:01');

      $exp = strtotime('2021-01-01 00:00:01');
      1 và buộc người dùng nhận mã thông báo mới bằng nút Đăng nhập tốt trước khi bất kỳ kiểm tra tiếp theo nào hoạt động

    app_client. php

    Tệp PHP phía máy chủ này chấp nhận các yêu cầu phương thức từ

    $nbf = strtotime('2021-01-01 00:00:01');

    $exp = strtotime('2021-01-01 00:00:01');
    6 và xử lý chúng theo đó

    Các yêu cầu POST chấp nhận các trường tên người dùng và mật khẩu và xác thực chúng, trả về lỗi nếu chúng không hợp lệ. Nếu chúng hợp lệ, thì tệp_______0_______7 được bao gồm (giải thích một chút) để xử lý tất cả các chức năng của mã thông báo. Sau đó, một số biến được tạo được sử dụng trong quá trình tạo JWT

    Đầu tiên là id người dùng được sử dụng làm yêu cầu đầu tiên của chúng tôi trong tải trọng

    ________số 8_______

    Điều này chỉ chứng minh rằng chúng tôi có thể đưa bất kỳ dữ liệu nào chúng tôi muốn vào một yêu cầu. Trong ví dụ này, chúng tôi bao gồm một chút thông tin hữu ích mà chúng tôi có thể sử dụng trên máy chủ sau này cho những việc như truy vấn dữ liệu dành riêng cho người dùng này mà không yêu cầu xác thực hoặc lựa chọn thêm

    Hai biến tiếp theo được sử dụng để kiểm soát tuổi thọ của mã thông báo

    $nbf = strtotime('2021-01-01 00:00:01');

    $exp = strtotime('2021-01-01 00:00:01');

    Các biến

    $nbf = strtotime('2021-01-01 00:00:01');

    $exp = strtotime('2021-01-01 00:00:01');
    8 và
    $nbf = strtotime('2021-01-01 00:00:01');

    $exp = strtotime('2021-01-01 00:00:01');
    9 tương ứng với các đối tác trường tiêu chuẩn của chúng trong tải trọng. Trong ví dụ trên, mã thông báo được tạo với ngày
    $serverKey = '5f2b5cdbe5194f10b3241568fe4e2b24';
    0(không phải trước đó) được đặt thành ngày 1 tháng 1 năm 2021, lúc 12. 01 một. m. sẽ không cho phép xác nhận trước ngày đó. Bạn có thể kiểm tra điều này trong môi trường phát triển của mình bằng cách bỏ ghi chú dòng đó và đặt ngày giờ thích hợp để kiểm tra

    Trong ví dụ trên, mã thông báo được tạo với ngày exp (hết hạn) được đặt thành ngày 1 tháng 1 năm 2021, lúc 12 giờ. 01 một. m. sẽ chỉ hoạt động cho đến ngày và giờ đó, tại thời điểm đó, nó sẽ hết hạn và không còn hiệu lực. Bạn có thể kiểm tra điều này trong môi trường phát triển của mình bằng cách bỏ ghi chú dòng này và đặt ngày giờ thích hợp

    Nếu một trong hai biến ngày/giờ này bị vi phạm, thì ______0_______2 sẽ trả về một lỗi ngoại lệ cho_______12_______3

    Biến cuối cùng là khóa máy chủ (trong trường hợp này là GUID) mà chúng tôi sẽ sử dụng cho thuật toán băm của mình trong chữ ký. Trong ví dụ của chúng tôi, chỉ máy chủ biết khóa;

    $serverKey = '5f2b5cdbe5194f10b3241568fe4e2b24';

    Khối mã tiếp theo đóng gói các biến xác nhận quyền sở hữu của chúng tôi thành một mảng tải trọng và sau đó chuyển mảng đó cùng với khóa máy chủ tới

    $nbf = strtotime('2021-01-01 00:00:01');

    $exp = strtotime('2021-01-01 00:00:01');
    7 để mã hóa thành mã thông báo

    // create a token
    $payloadArray = array();
    $payloadArray['userId'] = $userId;
    if (isset($nbf)) {$payloadArray['nbf'] = $nbf;}
    if (isset($exp)) {$payloadArray['exp'] = $exp;}
    $token = JWT::encode($payloadArray, $serverKey);

    // return to caller
    $returnArray = array('token' => $token);
    $jsonEncodedReturnArray = json_encode($returnArray, JSON_PRETTY_PRINT);
    echo $jsonEncodedReturnArray;

    Sau đó, mã thông báo kết quả được đóng gói thành một mảng trả về được mã hóa JSON và được trả lại cho

    $nbf = strtotime('2021-01-01 00:00:01');

    $exp = strtotime('2021-01-01 00:00:01');
    6

    jwt. php

    Thư viện lớp này dựa trên mã nguồn Firebase/JWT gốc được viết bởi Neuman Vong và Anant Narayanan được tìm thấy tại đây. https. //github. com/firebase/php-jwt

    Để tạo điều kiện thuận lợi cho ví dụ đơn giản của tôi, tôi đã loại bỏ nhu cầu phụ thuộc vào trình soạn thảo, tham chiếu không gian tên và ngoại lệ lỗi chuyên biệt. Tất cả các chức năng và giao diện khác vẫn giữ nguyên. Khi bạn đã nắm được các khái niệm, tôi khuyến khích bạn cài đặt thư viện lớp JWT của họ vì điều đó sẽ cung cấp cho bạn các bản cập nhật liên tục cho thư viện

    Thư viện lớp

    $nbf = strtotime('2021-01-01 00:00:01');

    $exp = strtotime('2021-01-01 00:00:01');
    7 cung cấp tất cả các chức năng để mã hóa và giải mã Mã thông báo web JSON, bao gồm xử lý các trường tiêu chuẩn tải trọng

    Dùng thử

    Bạn có thể tải xuống ba tệp này từ GitHub. Đặt tất cả chúng vào cùng một thư mục trong môi trường phát triển của bạn và dùng thử. Mã được cố ý viết để rõ ràng và dễ dàng thực hiện với trình gỡ lỗi

    Tôi hy vọng điều này sẽ giúp bạn hiểu được cách sử dụng Mã thông báo web JSON trong ngăn xếp xác thực của bạn

    JWT trong PHP là gì?

    Mã thông báo web JSON (JWT) là một cách an toàn để xác thực người dùng trên ứng dụng web . Sử dụng JWT, bạn có thể chuyển dữ liệu và thông tin được mã hóa một cách an toàn giữa máy khách và máy chủ. Tìm hiểu thêm về sự khác biệt giữa phiên và JWT tại đây. JWT mang lại nhiều lợi ích.

    Làm cách nào để tạo JWT trong PHP?

    Cách tạo 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 chuỗi tiêu đề và tải trọng Base64Url. .
    Tạo chữ ký. .
    Base64Url Mã hóa chữ ký. .
    Tạo mã thông báo web JSON

    JWT có tốt hơn OAuth không?

    Trường hợp sử dụng – JWT phù hợp hơn với API . OAuth hữu ích cho các ứng dụng và tài nguyên web, API và trình duyệt. Mã thông báo – JWT xác định định dạng mã thông báo. OAuth định nghĩa các giao thức ủy quyền.

    JWT là gì và tại sao nó được sử dụng?

    Mã thông báo web JSON (JWT) là Đối tượng JSON được sử dụng để truyền thông tin một cách an toàn qua web (giữa hai bên) . Nó có thể được sử dụng cho một hệ thống xác thực và cũng có thể được sử dụng để trao đổi thông tin. Mã thông báo chủ yếu bao gồm tiêu đề, tải trọng, chữ ký. Ba phần này được ngăn cách bởi dấu chấm (. ).