PHP là một ngôn ngữ lập trình kiểu lỏng lẻo. Điều đó có nghĩa là bạn không phải khai báo một biến trước khi sử dụng nó. Khi bạn gán một giá trị cho một biến, kiểu dữ liệu của nó sẽ tự động được gán cho biến đó. Khi bạn gán lại một giá trị có kiểu dữ liệu khác cho biến có sẵn, kiểu dữ liệu cũng thay đổi mà không gặp rắc rối. PHP có ít quy tắc cú pháp nhất mà các lập trình viên phải tuân theo, vì vậy nó giúp cho việc lập trình trong PHP dễ dàng hơn rất nhiều. Khi vi phạm các quy tắc này, bạn sẽ nhận được thông báo lỗi phân tích cú pháp trong trình duyệt. Mã thông báo trong PHP là tất cả các thành phần của chương trình
Bạn biết HTML không có nghĩa là bạn biết PHP. PHP là ngôn ngữ kịch bản trong khi HTML là ngôn ngữ đánh dấu. HTML có một tập hợp các thẻ để tạo các Trang Web được trình duyệt hiển thị để hiển thị văn bản. PHP cung cấp cho bạn khả năng thêm tương tác vào các trang tĩnh được tạo bằng HTML
Mã thông báo trong PHP
Trong bất kỳ ngôn ngữ lập trình nào, mã thông báo được định nghĩa là một phần tử độc lập được sử dụng để tạo chương trình. Trong PHP, mã thông báo được coi là một thành phần riêng lẻ của chương trình. Các từ khóa, biến, hằng, toán tử và chuỗi được sử dụng trong chương trình là các mã thông báo trong PHP
Từ khóa – Đây là những từ dành riêng đã được xác định trong PHP. Bạn không thể sử dụng chúng để khai báo biến hoặc hằng
Biến– Biến trong PHP được lập trình viên khai báo để lưu trữ các giá trị sử dụng trong chương trình để xử lý. Các biến bắt đầu bằng $. Tất cả các khai báo biến đều tuân theo các quy tắc có thể áp dụng trong bất kỳ ngôn ngữ lập trình nào mà bạn đã quen thuộc
Hằng số– đây là các giá trị Số, Văn bản hoặc Boolean cố định mà lập trình viên muốn sử dụng nhiều lần. Hằng số là một giá trị được xác định bằng tên và nó bị hạn chế cập nhật
Toán tử– toán tử được sử dụng để xử lý dữ liệu để chuyển đổi dữ liệu đó thành thông tin. Cộng, trừ, chia, so sánh, tăng là một số phép toán phổ biến và được thực hiện bằng cách sử dụng các toán tử có biến và hằng
Mã thông báo web JSON [JWT] đã trở thành tiêu chuẩn thực tế để xác thực trạng thái không trạng thái của ứng dụng dành cho thiết bị di động, ứng dụng web một trang và giao tiếp giữa máy với máy. Chúng hầu như đã thay thế phương thức xác thực truyền thống [phiên phía máy chủ] vì một số lợi ích chính
- Chúng được phân cấp và di động [bạn có thể yêu cầu mã thông báo từ một dịch vụ chuyên dụng, sau đó sử dụng nó với nhiều phụ trợ]
- Không cần phiên phía máy chủ - JWT có thể chứa tất cả thông tin cần thiết về người dùng và thông tin được bảo vệ chống sửa đổi
- Chúng hoạt động tốt và có thể mở rộng quy mô dễ dàng
Trước khi bạn bắt đầu làm việc với JWT, điều quan trọng là phải hiểu rằng JWT được mã hóa và không được mã hóa - chúng không ẩn dữ liệu chứa bên trong và người dùng có thể đọc được. Bạn không nên lưu trữ bất kỳ thông tin nhạy cảm nào bên trong JWT
Có một số lượng lớn thư viện được thiết kế để giúp bạn làm việc với JWT trong ứng dụng của mình. Trong bài viết này, trước tiên tôi sẽ hướng dẫn bạn xây dựng và xác minh JWT của riêng bạn bằng gói firebase/php-jwt. Sau đó, tôi sẽ chỉ cho bạn cách tạo ứng dụng giữa các máy trong Okta và sử dụng Luồng thông tin xác thực ứng dụng khách để nhận mã thông báo truy cập JWT từ máy chủ Okta của bạn
Các yêu cầu để hoàn thành các ví dụ là. Tài khoản Okta [miễn phí], các công cụ dòng lệnh PHP, Composer và
openssl genrsa -out mykey.pem 1024
openssl rsa -in mykey.pem -pubout > mykey.pub
8Tại sao Okta?
Okta là một dịch vụ API cho phép bạn tạo, chỉnh sửa và lưu trữ an toàn tài khoản người dùng và dữ liệu tài khoản người dùng, đồng thời kết nối chúng với một hoặc nhiều ứng dụng. Đăng ký tài khoản nhà phát triển miễn phí mãi mãi và khi bạn hoàn tất, hãy quay lại để tìm hiểu thêm về xác thực mã thông báo trong PHP
Có các luồng xác thực khác nhau trong Okta, tùy thuộc vào việc ứng dụng khách là công khai hay riêng tư và liệu có người dùng tham gia hay chỉ giao tiếp giữa máy với máy. Luồng thông tin xác thực ứng dụng khách mà bạn sẽ triển khai phù hợp nhất cho giao tiếp giữa các máy trong đó ứng dụng khách ở chế độ riêng tư [và có thể được tin cậy để giữ bí mật]
JWT là gì?
JWT là các chuỗi được mã hóa base64. Chúng độc lập và được ký bằng mật mã, có nghĩa là nội dung của chúng có thể được kiểm tra và xác minh. JWT có thể được ký bằng cách sử dụng bí mật chung [với thuật toán HMAC] hoặc cặp khóa công khai/riêng tư bằng RSA hoặc ECDSA. Nếu người dùng ác ý thay đổi nội dung mã thông báo, JWT sẽ không xác minh được
Định dạng của JWT là. ___
openssl genrsa -out mykey.pem 1024
openssl rsa -in mykey.pem -pubout > mykey.pub
9Thành phần tiêu đề chứa thông tin về phương thức ký. Thành phần tải trọng là thông tin về người dùng [còn được gọi là 'yêu cầu' của JWT]. Chữ ký được máy chủ xác thực tính toán bằng khóa bí mật chung hoặc khóa riêng
Nếu bạn muốn tìm hiểu thêm về cách sử dụng JWT một cách an toàn cũng như cách tạo và xác minh chúng từ đầu trong PHP [không sử dụng bất kỳ thư viện bên ngoài nào], bạn có thể xem bài viết trước của tôi Tạo và xác minh JWT trong PHP bằng OAuth 2. 0
Sử dụng JWT với OAuth 2. 0 và OpenID Kết nối trong PHP
Trước khi giải thích vai trò của JWT trong OAuth 2. 0 và OpenID Connect, điều quan trọng là phải làm rõ các khái niệm về xác thực và ủy quyền trong bảo mật thông tin
Xác thực có nghĩa là xác nhận rằng người dùng là người mà họ tuyên bố là. Ủy quyền có nghĩa là chứng minh rằng người dùng được xác thực có quyền làm điều gì đó trong hệ thống
OpenID Connect là một giao thức xác thực và OAuth 2. 0 là một tiêu chuẩn mở để ủy quyền. OpenID Connect sử dụng mã thông báo ID và OAuth 2. 0 sử dụng mã thông báo truy cập. Cùng với nhau, chúng cung cấp một khung hoàn chỉnh để xác thực và ủy quyền cho người dùng [hoặc máy] trong các ứng dụng web/di động và máy chủ
OAuth 2. 0 không nhất thiết phải là JWT, nhưng nhiều triển khai [bao gồm cả Okta] sử dụng JWT vì các thuộc tính mong muốn của chúng
Mặt khác, mã thông báo OpenID Connect [OIDC] luôn là JWT. Okta sử dụng phương thức ký cặp khóa công khai/riêng tư. Mã thông báo ID được ký bằng Khóa web JSON riêng [JWK], thông số kỹ thuật mà bạn có thể tìm thấy tại đây. Khóa web JSON [JWK]. Bạn cần truy xuất các khóa này và lưu trữ chúng trên máy chủ của mình nếu bạn muốn có thể xác minh mã thông báo Okta [ngoài ra, bạn có thể yêu cầu Okta xác minh mã thông báo cho bạn, nhưng điều này yêu cầu một chuyến đi khứ hồi bổ sung đến máy chủ ủy quyền]
Mã thông báo ID OIDC bao gồm các yêu cầu phổ biến sau
- Yêu cầu của
0 [nhà phát hành] khớp với mã định danh của Máy chủ ủy quyền Okta của bạn/vendor/ .env mykey.pem mykey.pub
- Yêu cầu của
1 [đối tượng] phải khớp với ID khách hàng được sử dụng để yêu cầu Mã thông báo ID/vendor/ .env mykey.pem mykey.pub
- Yêu cầu
2 [được phát hành tại thời điểm] cho biết thời điểm mã thông báo ID này được phát hành/vendor/ .env mykey.pem mykey.pub
- Yêu cầu
3 [thời gian hết hạn] là thời điểm mà mã thông báo này sẽ hết hạn/vendor/ .env mykey.pem mykey.pub
- Giá trị yêu cầu
4 phải khớp với bất kỳ giá trị nào được thông qua khi yêu cầu mã thông báo ID/vendor/ .env mykey.pem mykey.pub
Tạo và xác minh JWT trong PHP
Bạn sẽ sử dụng gói
/vendor/
.env
mykey.pem
mykey.pub
5 để tạo và xác minh JWT của riêng mình. Tôi cũng sẽ chỉ cho bạn cách sử dụng giải mã base64 để đọc các tuyên bố của JWT và chứng minh rằng nó được mã hóa đơn giản chứ không phải mã hóa [nhắc nhở. không lưu trữ bất kỳ thông tin nhạy cảm nào trong JWT]Bắt đầu bằng cách tạo một thư mục mới và khởi tạo nó như một dự án PHP mới với sự phụ thuộc vào
/vendor/
.env
mykey.pem
mykey.pub
5__________ 9
Tiếp theo, tạo một cặp khóa riêng/công khai bằng cách sử dụng openssl trên dòng lệnh
_
openssl genrsa -out mykey.pem 1024
openssl rsa -in mykey.pem -pubout > mykey.pub
Bạn sẽ sử dụng những thứ này để ký và xác minh JWT của mình
Tạo một tệp
/vendor/
.env
mykey.pem
mykey.pub
7 trong thư mục có nội dung sau để các tệp chính và tệp /vendor/
.env
mykey.pem
mykey.pub
8 của bạn sẽ không được thêm vào kho lưu trữ Git___
/vendor/
.env
mykey.pem
mykey.pub
Tạo một tệp
/vendor/
.env
mykey.pem
mykey.pub
9 để tải các thư viện của nhà cung cấp__________ 15
Tạo một tệp
openssl genrsa -out mykey.pem 1024
openssl rsa -in mykey.pem -pubout > mykey.pub
50___
openssl genrsa -out mykey.pem 1024
openssl rsa -in mykey.pem -pubout > mykey.pub
7Mã này tạo JWT và in nó ra. Nó sử dụng khóa riêng và thuật toán RS256 để ký tên
Chạy mã từ dòng lệnh và bạn sẽ thấy một cái gì đó như thế này
___
openssl genrsa -out mykey.pem 1024
openssl rsa -in mykey.pem -pubout > mykey.pub
8Công cụ tiếp theo bạn sẽ tạo là
openssl genrsa -out mykey.pem 1024
openssl rsa -in mykey.pem -pubout > mykey.pub
51, công cụ này chấp nhận JWT làm đối số và trả về các yêu cầu đã giải mã [không sử dụng bất kỳ khóa nào hoặc thậm chí cả thư viện JWT]____________ 151
___
/vendor/
.env
mykey.pem
mykey.pub
1Nếu bạn chạy nó với khóa ví dụ từ bước trước, bạn sẽ thấy kết quả như thế này
___
/vendor/
.env
mykey.pem
mykey.pub
2Điều này chứng tỏ rằng tất cả các yêu cầu đều có thể đọc được miễn phí mà không cần sử dụng bất kỳ phím nào. Các khóa được sử dụng để xác minh chữ ký [chỉ sử dụng khóa chung], đây là công cụ cuối cùng bạn sẽ xây dựng. ____________ 153
____________ 153
___
/vendor/
.env
mykey.pem
mykey.pub
5Một lần nữa, chạy nó từ dòng lệnh với mã thông báo bạn đã tạo
___
/vendor/
.env
mykey.pem
mykey.pub
6Lưu ý rằng khi xác minh JWT thực, bạn cũng phải đảm bảo rằng nó không hết hạn hoặc nằm trong danh sách đen. Ngoài ra, hãy đảm bảo không dựa vào thuật toán được chỉ định trong JWT mà sử dụng thuật toán tương tự như thuật toán được sử dụng để ký JWT. Đây là một chủ đề quan trọng đến mức nó yêu cầu một số chi tiết bổ sung trong phần tiếp theo
Các cuộc tấn công bảo mật vào thuật toán ký JWT trong PHP
Nếu bạn nhìn kỹ vào tiêu đề JWT, bạn sẽ nhận thấy trường
openssl genrsa -out mykey.pem 1024
openssl rsa -in mykey.pem -pubout > mykey.pub
55_
openssl genrsa -out mykey.pem 1024
openssl rsa -in mykey.pem -pubout > mykey.pub
0Nó chỉ định thuật toán được sử dụng để ký JWT. Một thuật toán đặc biệt mà tất cả các triển khai của JWT phải hỗ trợ là thuật toán 'không' [hoàn toàn không có chữ ký]. Nếu chúng tôi sửa đổi JWT để chỉ định thuật toán này và chương trình phụ trợ dựa vào trường này để xác minh, thì chương trình phụ trợ có thể chấp nhận JWT của chúng tôi là được ký chính xác ngay cả khi chúng tôi chỉ tạo ra nó
Ngoài ra còn có một kiểu tấn công khác khi dựa vào thuật toán được chỉ định trong JWT. nếu bạn chuyển thuật toán từ RS256 [sử dụng cặp khóa công khai/riêng tư] sang HS256 [sử dụng hàm băm với khóa bí mật dùng chung], chữ ký sẽ được xác minh bằng thuật toán HS256 nhưng với khóa chung làm khóa bí mật [gợi ý. kiểm tra cách thức hoạt động của
openssl genrsa -out mykey.pem 1024
openssl rsa -in mykey.pem -pubout > mykey.pub
56]. Vì khóa công khai đã được biết, bạn có thể ký JWT chính xác với nó và chúng sẽ được chấp nhậnBạn có thể tìm hiểu thêm về các cuộc tấn công này [và các cuộc tấn công khác] bằng cách đọc Tấn công xác thực JWT hoặc xem phần trình bày của Aaron Parecki OAuth. Khi mọi việc không như mong muốn
Phần kết luận. luôn sử dụng cùng một thuật toán để ký và xác minh JWT. Bỏ qua thuật toán được chỉ định trong tiêu đề JWT
Tạo ứng dụng giữa máy với máy bằng PHP và xác minh JWT
Trong phần này, tôi sẽ chỉ cho bạn cách tạo Ứng dụng giữa máy với máy ở Okta và cách sử dụng thư viện
openssl genrsa -out mykey.pem 1024
openssl rsa -in mykey.pem -pubout > mykey.pub
57 để nhận mã thông báo truy cập JWT từ máy chủ ủy quyền Okta của bạn thông qua Luồng thông tin xác thực ứng dụng kháchLuồng thông tin xác thực của khách hàng phù hợp nhất cho giao tiếp giữa máy với máy [nơi khách hàng có thể được tin cậy để giữ bí mật]. Đây là tài liệu của dòng chảy. Okta. Luồng thông tin xác thực khách hàng
Nếu bạn vẫn chưa tạo tài khoản nhà phát triển Okta miễn phí vĩnh viễn của mình, hãy thực hiện ngay bây giờ và sau đó tiếp tục với hướng dẫn
Đăng nhập và đi đến Ứng dụng, sau đó nhấp vào Thêm ứng dụng
Chọn Dịch vụ [Machine-to-Machine] và nhấp vào Tiếp theo
Nhập tiêu đề cho ứng dụng của bạn và nhấp vào Xong. Lưu ý các giá trị trong trường
openssl genrsa -out mykey.pem 1024
openssl rsa -in mykey.pem -pubout > mykey.pub
58 và openssl genrsa -out mykey.pem 1024
openssl rsa -in mykey.pem -pubout > mykey.pub
59 được hiển thị trên màn hình tiếp theo, bạn sẽ cần chúng khi xây dựng ứng dụngTrước khi tạo ứng dụng, còn một điều nữa cần cấu hình trong Okta. bạn cần tạo một phạm vi cho ứng dụng của mình
Truy cập Api > Máy chủ ủy quyền, lưu ý trường
openssl genrsa -out mykey.pem 1024
openssl rsa -in mykey.pem -pubout > mykey.pub
70 [bạn sẽ cần trường này khi định cấu hình ứng dụng] và nhấp vào máy chủ ủy quyền mặc định. Chuyển đến tab Phạm vi và nhấp vào Thêm Phạm vi. Thiết lập phạm vi của bạn như thế nàyBạn nên sao chép 4 giá trị nếu bạn làm đúng mọi thứ.
openssl genrsa -out mykey.pem 1024
openssl rsa -in mykey.pem -pubout > mykey.pub
71, openssl genrsa -out mykey.pem 1024
openssl rsa -in mykey.pem -pubout > mykey.pub
72, openssl genrsa -out mykey.pem 1024
openssl rsa -in mykey.pem -pubout > mykey.pub
70 và openssl genrsa -out mykey.pem 1024
openssl rsa -in mykey.pem -pubout > mykey.pub
74 [openssl genrsa -out mykey.pem 1024
openssl rsa -in mykey.pem -pubout > mykey.pub
75]Sử dụng Luồng thông tin xác thực của khách hàng để tạo mã thông báo truy cập JWT trong PHP
Tôi sẽ chỉ cho bạn cách nhận mã thông báo truy cập từ máy chủ ủy quyền Okta cho ứng dụng giữa các máy của bạn và cách xác minh mã thông báo [nếu bên thứ ba nhận được]. Chúng tôi sẽ sử dụng thư viện
openssl genrsa -out mykey.pem 1024
openssl rsa -in mykey.pem -pubout > mykey.pub
57Bắt đầu bằng cách tạo một tệp
openssl genrsa -out mykey.pem 1024
openssl rsa -in mykey.pem -pubout > mykey.pub
77 như thế này___
openssl genrsa -out mykey.pem 1024
openssl rsa -in mykey.pem -pubout > mykey.pub
1Sau đó sao chép nó vào
/vendor/
.env
mykey.pem
mykey.pub
8 [hãy nhớ, tệp này phải ở trong /vendor/
.env
mykey.pem
mykey.pub
7 để nó không được thêm vào repo] và điền thông tin chi tiết của bạn từ phần trướcBạn cần cài đặt các phụ thuộc mới. Ngoài thư viện
openssl genrsa -out mykey.pem 1024
openssl rsa -in mykey.pem -pubout > mykey.pub
57, bạn cũng cần có openssl genrsa -out mykey.pem 1024
openssl rsa -in mykey.pem -pubout > mykey.pub
81 để ứng dụng có thể đọc tệp /vendor/
.env
mykey.pem
mykey.pub
8 của bạn và openssl genrsa -out mykey.pem 1024
openssl rsa -in mykey.pem -pubout > mykey.pub
83 [do Okta yêu cầu]. Bạn đã có /vendor/
.env
mykey.pem
mykey.pub
5 [một yêu cầu khác của Okta] từ ví dụ trướcChạy lệnh sau
_
openssl genrsa -out mykey.pem 1024
openssl rsa -in mykey.pem -pubout > mykey.pub
2Cập nhật tệp
/vendor/
.env
mykey.pem
mykey.pub
9___
openssl genrsa -out mykey.pem 1024
openssl rsa -in mykey.pem -pubout > mykey.pub
3Công cụ đầu tiên bạn sẽ xây dựng là
openssl genrsa -out mykey.pem 1024
openssl rsa -in mykey.pem -pubout > mykey.pub
86 [được sử dụng để yêu cầu mã thông báo truy cập từ máy chủ ủy quyền Okta]__________ 186
___
openssl genrsa -out mykey.pem 1024
openssl rsa -in mykey.pem -pubout > mykey.pub
4Chạy nó từ dòng lệnh, bạn sẽ nhận được kết quả như thế này
___
openssl genrsa -out mykey.pem 1024
openssl rsa -in mykey.pem -pubout > mykey.pub
5Công cụ thứ hai là
openssl genrsa -out mykey.pem 1024
openssl rsa -in mykey.pem -pubout > mykey.pub
88. Nó chấp nhận mã thông báo truy cập từ dòng lệnh và xác minh nó____________ 188
___
openssl genrsa -out mykey.pem 1024
openssl rsa -in mykey.pem -pubout > mykey.pub
6Chạy nó với mã thông báo truy cập bạn vừa nhận được và bạn sẽ thấy kết quả tương tự
___
openssl genrsa -out mykey.pem 1024
openssl rsa -in mykey.pem -pubout > mykey.pub
7Nếu mã thông báo không hợp lệ hoặc hết hạn, bạn sẽ thấy thông báo lỗi
Đó là ý chính của Luồng thông tin xác thực khách hàng của JWT và Okta. Tuy nhiên, còn nhiều điều nữa để tìm hiểu về các chủ đề này, hãy kiểm tra các tài nguyên trong phần tiếp theo để tìm một số liên kết hữu ích để khám phá thêm
Tìm hiểu thêm về JWT trong PHP, OAuth 2. 0 và Kết nối OpenID
Bạn có thể tìm thấy toàn bộ ví dụ mã ở đây. liên kết GitHub
Nếu bạn muốn tìm hiểu sâu hơn về các chủ đề được đề cập trong bài viết này, các tài nguyên sau đây là điểm khởi đầu tuyệt vời
- Tạo và xác minh JWT trong PHP với OAuth 2. 0
- Thêm Xác thực vào Ứng dụng PHP của bạn sau 5 phút
- Xây dựng đăng nhập đơn giản trong PHP
Thích những gì bạn học được ngày hôm nay? Hãy theo dõi chúng tôi trên Twitter và đăng ký kênh YouTube của chúng tôi để có thêm nội dung tuyệt vời