Tỉnh PHP

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
8

Tạ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
9

Thà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
    /vendor/
    .env
    mykey.pem
    mykey.pub
    
    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
  • Yêu cầu của
    /vendor/
    .env
    mykey.pem
    mykey.pub
    
    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
  • Yêu cầu
    /vendor/
    .env
    mykey.pem
    mykey.pub
    
    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
  • Yêu cầu
    /vendor/
    .env
    mykey.pem
    mykey.pub
    
    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
  • Giá trị yêu cầu
    /vendor/
    .env
    mykey.pem
    mykey.pub
    
    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

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
7

Mã 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
8

Cô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
1

Nế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
5

Mộ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
6

Lư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
0

Nó 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ận

Bạ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ách

Luồ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ụng

Trướ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ày

Bạ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
57

Bắ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
1

Sau đó 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ước

Bạ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ước

Chạy lệnh sau

_

openssl genrsa -out mykey.pem 1024
openssl rsa -in mykey.pem -pubout > mykey.pub
2

Cậ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
3

Cô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
4

Chạ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
5

Cô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
6

Chạ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
7

Nế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

Mã thông báo trong PHP là gì?

Sử dụng Xác thực mã thông báo trong ứng dụng PHP của bạn cho phép bạn cho phép người dùng đăng nhập bằng tên người dùng và mật khẩu một lần, truy xuất mã thông báo truy cập và làm mới, sau đó lưu trữ chúng trên máy khách . Tất cả các yêu cầu trong tương lai sẽ được thực hiện bằng cách sử dụng mã thông báo truy cập để xác định người dùng.

Làm cách nào để nhận mã thông báo 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 tiêu đề url Base64 và chuỗi tải trọng. .
Tạo chữ ký. .
Base64 Url Mã hóa chữ ký. .
Tạo mã thông báo web JSON

Làm cách nào để tạo mã thông báo cho API trong PHP?

PHP sử dụng OpenTok\OpenTok; $opentok = new OpenTok[API_KEY,API_SECRET]; // Thay thế bằng ID phiên chính xác. print $opentok->generateToken['your_session_ID']; print "\n"; ?> Gọi phương thức generateToken[] trả về một chuỗi. Chuỗi này là mã thông báo

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

Sử dụng JWT cho Mã thông báo truy cập trong PHP .
Truy xuất và phân tích cú pháp Khóa web JSON Okta [JWK] của bạn, khóa này sẽ được ứng dụng của bạn kiểm tra định kỳ và lưu vào bộ đệm ẩn
Giải mã mã thông báo truy cập ở định dạng Mã thông báo web JSON
Xác minh chữ ký được sử dụng để ký mã thông báo truy cập
Xác minh các khiếu nại được tìm thấy bên trong mã thông báo truy cập

Chủ Đề