Cách tạo mã thông báo trong PHP
Hầu hết các ứng dụng chỉ cần một mã thông báo hoặc mã thông báo cho mỗi người dùng trong một danh sách người dùng tĩnh nhỏ. Đối với các ứng dụng này, vui lòng sử dụng Công cụ tạo mã thông báo để tạo tất cả các mã thông báo của bạn. Bạn không cần sử dụng quy trình AuthNAuth Show
Một vài ứng dụng có danh sách người dùng lớn hoặc danh sách người dùng động. Các ứng dụng này sẽ cần nhận mã thông báo thường xuyên. Đính kèm là một tệp PHP mẫu nhỏ cho biết cách nhận mã thông báo người dùng theo chương trình. Nếu bạn cần mã định danh người dùng cho cơ sở dữ liệu của mình, vui lòng sử dụ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
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í), PHP, Composer và 8 công cụ dòng lệnhTạ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à. 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 xây dựng 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 PHPTrướ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
Tạo và xác minh JWT trong PHPBạn sẽ sử dụng gói 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 5
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
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 7 trong thư mục với các nội dung sau để các tệp chính và tệp 8 của bạn sẽ không được thêm vào kho lưu trữ Git
Tạo một tệp 9 để tải các thư viện của nhà cung cấp
Tạo một tệp 0
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
Công cụ tiếp theo bạn sẽ tạo là 1 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) 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
Đ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. 3 3
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
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 PHPNếu bạn nhìn kỹ vào tiêu đề JWT, bạn sẽ nhận thấy trường 5 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 'none' (không có chữ ký nào cả). 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 6). 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 JWTTrong 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 7 để 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 8 và 9 đượ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 định 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 0 (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ứ. 1, 2, 0 và 4 ( 5)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 PHPTô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 7Bắt đầu bằng cách tạo một tệp 7 như thế này 1Sau đó, sao chép nó vào 8 (hãy nhớ rằng tệp này phải ở trong 7 để nó không được thêm vào kho lưu trữ) 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 7, bạn cũng cần có 1 để ứng dụng có thể đọc tệp 8 của bạn và 3 (do Okta yêu cầu). Bạn đã có 5 (một yêu cầu khác của Okta) từ ví dụ trướcChạy lệnh sau 2Cập nhật tệp 9 3Công cụ đầu tiên bạn sẽ xây dựng là 6 (được sử dụng để yêu cầu mã thông báo truy cập từ máy chủ ủy quyền Okta) 6 4Chạy nó từ dòng lệnh, bạn sẽ nhận được kết quả như thế này 5Công cụ thứ hai là 8. Nó chấp nhận mã thông báo truy cập từ dòng lệnh và xác minh nó 8 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ự 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 OpenIDBạ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
Giống như những gì bạn đã học ngày hôm nay? 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 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 Làm cách nào để tạo mã thông báo JWT trong PHP?Để tạo JWT, bạn cần chủ yếu là tiêu đề, tải trọng và bí mật. Tiếp theo, bạn tạo chữ ký từ tiêu đề được mã hóa, tải trọng được mã hóa, bí mật, thuật toán được chỉ định trong tiêu đề . Các thuật toán mật mã điển hình được sử dụng là HMAC với chữ ký SHA-256 (HS256) và RSA với SHA-256 (RS256).
Làm cách nào chúng tôi có thể tạo mã thông báo?Để tạo mã thông báo xác thực mới. . Ở góc trên cùng bên phải của Bảng điều khiển, hãy mở menu Hồ sơ (. Trên trang Mã thông báo xác thực, nhấp vào Tạo mã thông báo Nhập mô tả thân thiện cho mã thông báo xác thực. . Nhấp vào Tạo mã thông báo Làm cách nào để tạo mã thông báo mang trong PHP?Để gửi yêu cầu có tiêu đề ủy quyền Mã thông báo người mang bằng PHP, bạn cần phải thực hiện yêu cầu HTTP GET hoặc POST và cung cấp Mã thông báo người gửi của bạn cùng với Ủy quyền. Tiêu đề HTTP {token} của người mang . |