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

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

  • 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í), PHP, Composer và

openssl genrsa -out mykey.pem 1024
openssl rsa -in mykey.pem -pubout > mykey.pub
8 công cụ dòng lệnh

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

composer require firebase/php-jwt

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 với 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


require 'vendor/autoload.php';

Tạo một tệp


require 'vendor/autoload.php';
0


require('./bootstrap.php');

use \Firebase\JWT\JWT;

$privateKey = file_get_contents('mykey.pem');

$token = array(
    "iss" => "http://example.org",
    "aud" => "http://example.com",
    "iat" => 1356999524,
    "nbf" => 1357000000
);

/**
 * IMPORTANT:
 * You must specify supported algorithms for your application. See
 * https://tools.ietf.org/html/draft-ietf-jose-json-web-algorithms-40
 * for a list of spec-compliant algorithms.
 */
$jwt = JWT::encode($token, $privateKey, 'RS256');

echo $jwt . "\n";

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

php jwt-generate.php
eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9leGFtcGxlLm9yZyIsImF1ZCI6Imh0dHA6XC9cL2V4YW1wbGUuY29tIiwiaWF0IjoxMzU2OTk5NTI0LCJuYmYiOjEzNTcwMDAwMDB9.m_RtU0biD_xRy0DUVH7QWoNaLRqLWZadzpYO7tKnYbMlcRw8gYzZ9xI4aUJFf5BnyzKHY1LKmBdcU_-jotiJOZ0Ro_kRvcEPQRuu3OgLgQPTdyFHPrBRzGnQAAgfUdyHl1mKIJqe2bjdkiGDx8ShXnn3VZxpXzQLEDrH51IKuFI

Công cụ tiếp theo bạn sẽ tạo là


require 'vendor/autoload.php';
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)


require 'vendor/autoload.php';
1


require('./bootstrap.php');

// read a JWT from the command line
if (! isset($argv[1])) {
    exit('Please provide a key to verify');
}

$jwt = $argv[1];

list($header, $payload, $signature) = explode(".", $jwt);

$plainHeader = base64_decode($header);
echo "Header:\n$plainHeader\n\n"; 

$plainPayload = base64_decode($payload);
echo "Payload:\n$plainPayload\n\n";

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

php jwt-decode.php eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9leGFtcGxlLm9yZyIsImF1ZCI6Imh0dHA6XC9cL2V4YW1wbGUuY29tIiwiaWF0IjoxMzU2OTk5NTI0LCJuYmYiOjEzNTcwMDAwMDB9.m_RtU0biD_xRy0DUVH7QWoNaLRqLWZadzpYO7tKnYbMlcRw8gYzZ9xI4aUJFf5BnyzKHY1LKmBdcU_-jotiJOZ0Ro_kRvcEPQRuu3OgLgQPTdyFHPrBRzGnQAAgfUdyHl1mKIJqe2bjdkiGDx8ShXnn3VZxpXzQLEDrH51IKuFI

Header:
{"typ":"JWT","alg":"RS256"}

Payload:
{"iss":"http://example.org","aud":"http://example.com","iat":1356999524,"nbf":1357000000}

Đ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.


require 'vendor/autoload.php';
3


require 'vendor/autoload.php';
3


require('./bootstrap.php');

use \Firebase\JWT\JWT;

$publicKey = file_get_contents('mykey.pub');

// read a JWT from the command line
if (! isset($argv[1])) {
    exit('Please provide a key to verify');
}

$jwt = $argv[1];

$decoded = JWT::decode($jwt, $publicKey, ['RS256']);

/*
 NOTE: This will now be an object instead of an associative array. To get
 an associative array, you will need to cast it as such:
*/
print_r((array) $decoded);

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

php jwt-verify.php eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9leGFtcGxlLm9yZyIsImF1ZCI6Imh0dHA6XC9cL2V4YW1wbGUuY29tIiwiaWF0IjoxMzU2OTk5NTI0LCJuYmYiOjEzNTcwMDAwMDB9.m_RtU0biD_xRy0DUVH7QWoNaLRqLWZadzpYO7tKnYbMlcRw8gYzZ9xI4aUJFf5BnyzKHY1LKmBdcU_-jotiJOZ0Ro_kRvcEPQRuu3OgLgQPTdyFHPrBRzGnQAAgfUdyHl1mKIJqe2bjdkiGDx8ShXnn3VZxpXzQLEDrH51IKuFI

Array
(
    [iss] => http://example.org
    [aud] => http://example.com
    [iat] => 1356999524
    [nbf] => 1357000000
)

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


require 'vendor/autoload.php';
5

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 '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


require 'vendor/autoload.php';
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ậ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


require 'vendor/autoload.php';
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á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

Cách tạo mã thông báo trong PHP

Chọn Dịch vụ (Machine-to-Machine) và nhấp vào Tiếp theo

Cách tạo mã thông báo trong PHP

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


require 'vendor/autoload.php';
8 và

require 'vendor/autoload.php';
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ụng

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


require('./bootstrap.php');

use \Firebase\JWT\JWT;

$privateKey = file_get_contents('mykey.pem');

$token = array(
    "iss" => "http://example.org",
    "aud" => "http://example.com",
    "iat" => 1356999524,
    "nbf" => 1357000000
);

/**
 * IMPORTANT:
 * You must specify supported algorithms for your application. See
 * https://tools.ietf.org/html/draft-ietf-jose-json-web-algorithms-40
 * for a list of spec-compliant algorithms.
 */
$jwt = JWT::encode($token, $privateKey, 'RS256');

echo $jwt . "\n";
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ày

Cách tạo mã thông báo trong PHP

Bạn nên sao chép 4 giá trị nếu bạn làm đúng mọi thứ.


require('./bootstrap.php');

use \Firebase\JWT\JWT;

$privateKey = file_get_contents('mykey.pem');

$token = array(
    "iss" => "http://example.org",
    "aud" => "http://example.com",
    "iat" => 1356999524,
    "nbf" => 1357000000
);

/**
 * IMPORTANT:
 * You must specify supported algorithms for your application. See
 * https://tools.ietf.org/html/draft-ietf-jose-json-web-algorithms-40
 * for a list of spec-compliant algorithms.
 */
$jwt = JWT::encode($token, $privateKey, 'RS256');

echo $jwt . "\n";
1,

require('./bootstrap.php');

use \Firebase\JWT\JWT;

$privateKey = file_get_contents('mykey.pem');

$token = array(
    "iss" => "http://example.org",
    "aud" => "http://example.com",
    "iat" => 1356999524,
    "nbf" => 1357000000
);

/**
 * IMPORTANT:
 * You must specify supported algorithms for your application. See
 * https://tools.ietf.org/html/draft-ietf-jose-json-web-algorithms-40
 * for a list of spec-compliant algorithms.
 */
$jwt = JWT::encode($token, $privateKey, 'RS256');

echo $jwt . "\n";
2,

require('./bootstrap.php');

use \Firebase\JWT\JWT;

$privateKey = file_get_contents('mykey.pem');

$token = array(
    "iss" => "http://example.org",
    "aud" => "http://example.com",
    "iat" => 1356999524,
    "nbf" => 1357000000
);

/**
 * IMPORTANT:
 * You must specify supported algorithms for your application. See
 * https://tools.ietf.org/html/draft-ietf-jose-json-web-algorithms-40
 * for a list of spec-compliant algorithms.
 */
$jwt = JWT::encode($token, $privateKey, 'RS256');

echo $jwt . "\n";
0 và

require('./bootstrap.php');

use \Firebase\JWT\JWT;

$privateKey = file_get_contents('mykey.pem');

$token = array(
    "iss" => "http://example.org",
    "aud" => "http://example.com",
    "iat" => 1356999524,
    "nbf" => 1357000000
);

/**
 * IMPORTANT:
 * You must specify supported algorithms for your application. See
 * https://tools.ietf.org/html/draft-ietf-jose-json-web-algorithms-40
 * for a list of spec-compliant algorithms.
 */
$jwt = JWT::encode($token, $privateKey, 'RS256');

echo $jwt . "\n";
4 (

require('./bootstrap.php');

use \Firebase\JWT\JWT;

$privateKey = file_get_contents('mykey.pem');

$token = array(
    "iss" => "http://example.org",
    "aud" => "http://example.com",
    "iat" => 1356999524,
    "nbf" => 1357000000
);

/**
 * IMPORTANT:
 * You must specify supported algorithms for your application. See
 * https://tools.ietf.org/html/draft-ietf-jose-json-web-algorithms-40
 * for a list of spec-compliant algorithms.
 */
$jwt = JWT::encode($token, $privateKey, 'RS256');

echo $jwt . "\n";
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 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


require 'vendor/autoload.php';
7

Bắt đầu bằng cách tạo một tệp


require('./bootstrap.php');

use \Firebase\JWT\JWT;

$privateKey = file_get_contents('mykey.pem');

$token = array(
    "iss" => "http://example.org",
    "aud" => "http://example.com",
    "iat" => 1356999524,
    "nbf" => 1357000000
);

/**
 * IMPORTANT:
 * You must specify supported algorithms for your application. See
 * https://tools.ietf.org/html/draft-ietf-jose-json-web-algorithms-40
 * for a list of spec-compliant algorithms.
 */
$jwt = JWT::encode($token, $privateKey, 'RS256');

echo $jwt . "\n";
7 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ớ rằng tệp này phải ở trong
/vendor/
.env
mykey.pem
mykey.pub
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ước

Bạn cần cài đặt các phụ thuộc mới. Ngoài thư viện


require 'vendor/autoload.php';
7, bạn cũng cần có
php jwt-generate.php
eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9leGFtcGxlLm9yZyIsImF1ZCI6Imh0dHA6XC9cL2V4YW1wbGUuY29tIiwiaWF0IjoxMzU2OTk5NTI0LCJuYmYiOjEzNTcwMDAwMDB9.m_RtU0biD_xRy0DUVH7QWoNaLRqLWZadzpYO7tKnYbMlcRw8gYzZ9xI4aUJFf5BnyzKHY1LKmBdcU_-jotiJOZ0Ro_kRvcEPQRuu3OgLgQPTdyFHPrBRzGnQAAgfUdyHl1mKIJqe2bjdkiGDx8ShXnn3VZxpXzQLEDrH51IKuFI
1 để ứng dụng có thể đọc tệp
/vendor/
.env
mykey.pem
mykey.pub
8 của bạn và
php jwt-generate.php
eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9leGFtcGxlLm9yZyIsImF1ZCI6Imh0dHA6XC9cL2V4YW1wbGUuY29tIiwiaWF0IjoxMzU2OTk5NTI0LCJuYmYiOjEzNTcwMDAwMDB9.m_RtU0biD_xRy0DUVH7QWoNaLRqLWZadzpYO7tKnYbMlcRw8gYzZ9xI4aUJFf5BnyzKHY1LKmBdcU_-jotiJOZ0Ro_kRvcEPQRuu3OgLgQPTdyFHPrBRzGnQAAgfUdyHl1mKIJqe2bjdkiGDx8ShXnn3VZxpXzQLEDrH51IKuFI
3 (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à

php jwt-generate.php
eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9leGFtcGxlLm9yZyIsImF1ZCI6Imh0dHA6XC9cL2V4YW1wbGUuY29tIiwiaWF0IjoxMzU2OTk5NTI0LCJuYmYiOjEzNTcwMDAwMDB9.m_RtU0biD_xRy0DUVH7QWoNaLRqLWZadzpYO7tKnYbMlcRw8gYzZ9xI4aUJFf5BnyzKHY1LKmBdcU_-jotiJOZ0Ro_kRvcEPQRuu3OgLgQPTdyFHPrBRzGnQAAgfUdyHl1mKIJqe2bjdkiGDx8ShXnn3VZxpXzQLEDrH51IKuFI
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)

php jwt-generate.php
eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9leGFtcGxlLm9yZyIsImF1ZCI6Imh0dHA6XC9cL2V4YW1wbGUuY29tIiwiaWF0IjoxMzU2OTk5NTI0LCJuYmYiOjEzNTcwMDAwMDB9.m_RtU0biD_xRy0DUVH7QWoNaLRqLWZadzpYO7tKnYbMlcRw8gYzZ9xI4aUJFf5BnyzKHY1LKmBdcU_-jotiJOZ0Ro_kRvcEPQRuu3OgLgQPTdyFHPrBRzGnQAAgfUdyHl1mKIJqe2bjdkiGDx8ShXnn3VZxpXzQLEDrH51IKuFI
6

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à

php jwt-generate.php
eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9leGFtcGxlLm9yZyIsImF1ZCI6Imh0dHA6XC9cL2V4YW1wbGUuY29tIiwiaWF0IjoxMzU2OTk5NTI0LCJuYmYiOjEzNTcwMDAwMDB9.m_RtU0biD_xRy0DUVH7QWoNaLRqLWZadzpYO7tKnYbMlcRw8gYzZ9xI4aUJFf5BnyzKHY1LKmBdcU_-jotiJOZ0Ro_kRvcEPQRuu3OgLgQPTdyFHPrBRzGnQAAgfUdyHl1mKIJqe2bjdkiGDx8ShXnn3VZxpXzQLEDrH51IKuFI
8. Nó chấp nhận mã thông báo truy cập từ dòng lệnh và xác minh nó

php jwt-generate.php
eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9leGFtcGxlLm9yZyIsImF1ZCI6Imh0dHA6XC9cL2V4YW1wbGUuY29tIiwiaWF0IjoxMzU2OTk5NTI0LCJuYmYiOjEzNTcwMDAwMDB9.m_RtU0biD_xRy0DUVH7QWoNaLRqLWZadzpYO7tKnYbMlcRw8gYzZ9xI4aUJFf5BnyzKHY1LKmBdcU_-jotiJOZ0Ro_kRvcEPQRuu3OgLgQPTdyFHPrBRzGnQAAgfUdyHl1mKIJqe2bjdkiGDx8ShXnn3VZxpXzQLEDrH51IKuFI
8

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

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 .