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 exp
vànbf
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'];
1
$exp = strtotime['2021-01-01 00:00:01']; - Đă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'];
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
$exp = strtotime['2021-01-01 00:00:01']; - 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'];
1. Nếu thành công,
$exp = strtotime['2021-01-01 00:00:01'];$nbf = 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
$exp = strtotime['2021-01-01 00:00:01']; - Đă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'];
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
$exp = strtotime['2021-01-01 00:00:01'];
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 traTrong 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'];
6jwt. 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ọngDù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