Bạn dự định hoặc đang làm việc với một API bắt buộc phải được xác thực bằng mã thông báo JWT Bearer?
Cách thủ công để gửi mã thông báo tới cuộc gọi http của bạn là thêm nó vào tiêu đề truy vấn của bạn
:withHeaders[[ 'Authorization' => 'Bearer ' . getenv['TOKEN'], ]];
Cách dễ dàng hơn với phương thức withToken[]
Bạn chỉ cần sử dụng phương thức withToken để gửi yêu cầu của mình bằng mã thông báo
:withToken[getenv['TOKEN']]->post[...]
Laravel Passport cung cấp triển khai máy chủ OAuth2 đầy đủ cho ứng dụng Laravel của bạn chỉ trong vài phút. Hộ chiếu được xây dựng trên máy chủ League OAuth2 được duy trì bởi Andy Millington và Simon Hamp
Cảnh báo
Tài liệu này giả định rằng bạn đã quen thuộc với OAuth2. Nếu bạn chưa biết gì về OAuth2, hãy cân nhắc tự làm quen với thuật ngữ chung và các tính năng của OAuth2 trước khi tiếp tục.
Hộ chiếu hay Sanctum?
Trước khi bắt đầu, bạn có thể muốn xác định xem ứng dụng của mình sẽ được phục vụ tốt hơn bởi Laravel Passport hay Laravel Sanctum. Nếu ứng dụng của bạn thực sự cần hỗ trợ OAuth2, thì bạn nên sử dụng Laravel Passport
Tuy nhiên, nếu bạn đang cố gắng xác thực ứng dụng một trang, ứng dụng di động hoặc phát hành mã thông báo API, bạn nên sử dụng Laravel Sanctum. Laravel Sanctum không hỗ trợ OAuth2;
Cài đặt
Để bắt đầu, hãy cài đặt Passport thông qua trình quản lý gói Composer
composer require laravel/passport
Nhà cung cấp dịch vụ hộ chiếu đăng ký thư mục di chuyển cơ sở dữ liệu của riêng mình, vì vậy bạn nên di chuyển cơ sở dữ liệu của mình sau khi cài đặt gói. Quá trình di chuyển Hộ chiếu sẽ tạo các bảng mà ứng dụng của bạn cần để lưu trữ ứng dụng khách OAuth2 và mã thông báo truy cập
Tiếp theo, bạn nên thực hiện lệnh
php artisan vendor:publish --tag=passport-migrations
3 Artisan. Lệnh này sẽ tạo các khóa mã hóa cần thiết để tạo mã thông báo truy cập an toàn. Ngoài ra, lệnh sẽ tạo các ứng dụng khách "quyền truy cập cá nhân" và "cấp mật khẩu" sẽ được sử dụng để tạo mã thông báo truy cậpphp artisan passport:install
Lưu ý
Nếu bạn muốn sử dụng UUID làm giá trị khóa chính của mẫu Passport4 thay vì số nguyên tăng tự động, vui lòng cài đặt Passport bằng cách sử dụng.
php artisan vendor:publish --tag=passport-migrations
Sau khi chạy lệnh
php artisan vendor:publish --tag=passport-migrations
3, hãy thêm đặc điểm php artisan vendor:publish --tag=passport-migrations
7 vào mô hình php artisan vendor:publish --tag=passport-migrations
8 của bạn. Đặc điểm này sẽ cung cấp một vài phương thức trợ giúp cho mô hình của bạn, cho phép bạn kiểm tra phạm vi và mã thông báo của người dùng đã được xác thực. Nếu mô hình của bạn đã sử dụng đặc điểm php artisan vendor:publish --tag=passport-migrations
9, bạn có thể loại bỏ đặc điểm đó:withToken[getenv['TOKEN']]->post[...]0
Cuối cùng, trong tệp cấu hình
:withToken[getenv['TOKEN']]->post[...]10 của ứng dụng, bạn nên xác định bộ bảo vệ xác thực
:withToken[getenv['TOKEN']]->post[...]11 và đặt tùy chọn
:withToken[getenv['TOKEN']]->post[...]12 thành
:withToken[getenv['TOKEN']]->post[...]13. Điều này sẽ hướng dẫn ứng dụng của bạn sử dụng
:withToken[getenv['TOKEN']]->post[...]14 của Hộ chiếu khi xác thực các yêu cầu API đến
UUID ứng dụng khách
Bạn cũng có thể chạy lệnh
php artisan vendor:publish --tag=passport-migrations
3 khi có tùy chọn :withToken[getenv['TOKEN']]->post[...]16. Tùy chọn này sẽ hướng dẫn Hộ chiếu rằng bạn muốn sử dụng UUID thay vì số nguyên tăng tự động làm giá trị khóa chính của mẫu Hộ chiếu
php artisan vendor:publish --tag=passport-migrations
4. Sau khi chạy lệnh php artisan vendor:publish --tag=passport-migrations
3 với tùy chọn :withToken[getenv['TOKEN']]->post[...]16, bạn sẽ được cung cấp hướng dẫn bổ sung về việc tắt di chuyển mặc định của Hộ chiếu
composer require laravel/passport
1Triển khai hộ chiếu
Khi triển khai Passport cho máy chủ ứng dụng của bạn lần đầu tiên, bạn có thể sẽ cần chạy lệnh
composer require laravel/passport
20. Lệnh này tạo các khóa mã hóa mà Hộ chiếu cần để tạo mã thông báo truy cập. Các khóa được tạo thường không được giữ trong kiểm soát nguồnNếu cần, bạn có thể xác định đường dẫn nơi các khóa của Hộ chiếu sẽ được tải từ đó. Bạn có thể sử dụng phương pháp
composer require laravel/passport
21 để thực hiện điều này. Thông thường, phương thức này nên được gọi từ phương thức composer require laravel/passport
22 của lớp composer require laravel/passport
23 trong ứng dụng của bạncomposer require laravel/passport
6Tải phím từ môi trường
Ngoài ra, bạn có thể xuất bản tệp cấu hình của Hộ chiếu bằng lệnh Artisan
composer require laravel/passport
24composer require laravel/passport
8Sau khi tệp cấu hình đã được xuất bản, bạn có thể tải các khóa mã hóa của ứng dụng bằng cách xác định chúng dưới dạng biến môi trường
composer require laravel/passport
9Tùy chỉnh di chuyển
Nếu bạn không sử dụng các migration mặc định của Passport, bạn nên gọi phương thức
composer require laravel/passport
25 trong phương thức composer require laravel/passport
26 của lớp composer require laravel/passport
27 của bạn. Bạn có thể xuất các lần di chuyển mặc định bằng lệnh Artisan composer require laravel/passport
24php artisan vendor:publish --tag=passport-migrations
Nâng cấp hộ chiếu
Khi nâng cấp lên phiên bản chính mới của Passport, điều quan trọng là bạn phải xem kỹ hướng dẫn nâng cấp
Cấu hình
Băm bí mật của khách hàng
Nếu bạn muốn bí mật của khách hàng được băm khi lưu trữ trong cơ sở dữ liệu của mình, bạn nên gọi phương thức
composer require laravel/passport
29 trong phương thức composer require laravel/passport
22 của lớp composer require laravel/passport
23 của bạn:withToken[getenv['TOKEN']]->post[...]1
Sau khi được bật, tất cả các bí mật ứng dụng khách của bạn sẽ chỉ hiển thị cho người dùng ngay sau khi chúng được tạo. Vì giá trị bí mật của máy khách văn bản thuần túy không bao giờ được lưu trữ trong cơ sở dữ liệu nên không thể khôi phục giá trị của bí mật nếu nó bị mất
Vòng đời mã thông báo
Theo mặc định, Hộ chiếu phát hành mã thông báo truy cập lâu dài sẽ hết hạn sau một năm. Nếu bạn muốn định cấu hình thời gian tồn tại của mã thông báo dài hơn/ngắn hơn, bạn có thể sử dụng các phương thức
php artisan passport:install
02, php artisan passport:install
03 và php artisan passport:install
04. Các phương thức này nên được gọi từ phương thức composer require laravel/passport
22 của lớp composer require laravel/passport
23 trong ứng dụng của bạncomposer require laravel/passport
2Cảnh báo
Các cột07 trên bảng cơ sở dữ liệu của Hộ chiếu là chỉ đọc và chỉ dành cho mục đích hiển thị. Khi phát hành mã thông báo, Hộ chiếu lưu trữ thông tin hết hạn trong mã thông báo đã ký và mã hóa. Nếu bạn cần làm mất hiệu lực mã thông báo, bạn nên.
php artisan passport:install
Ghi đè các mô hình mặc định
Bạn có thể tự do mở rộng các mô hình được Passport sử dụng nội bộ bằng cách xác định mô hình của riêng bạn và mở rộng mô hình Passport tương ứng
php artisan passport:install
0Sau khi xác định mô hình của mình, bạn có thể hướng dẫn Hộ chiếu sử dụng mô hình tùy chỉnh của mình thông qua lớp
php artisan passport:install
08. Thông thường, bạn nên thông báo cho Hộ chiếu về các mô hình tùy chỉnh của mình theo phương thức composer require laravel/passport
22 của lớp composer require laravel/passport
23 trong ứng dụng của bạnphp artisan passport:install
1Ghi đè các tuyến đường
Đôi khi bạn có thể muốn tùy chỉnh các tuyến đường được xác định bởi Hộ chiếu. Để đạt được điều này, trước tiên bạn cần bỏ qua các tuyến đường được đăng ký bởi Hộ chiếu bằng cách thêm
php artisan passport:install
11 vào phương thức composer require laravel/passport
26 của ứng dụng của bạn php artisan passport:install
13php artisan passport:install
2Sau đó, bạn có thể sao chép các tuyến đường được xác định bởi Hộ chiếu trong tệp tuyến đường của nó vào tệp
php artisan passport:install
14 của ứng dụng của bạn và sửa đổi chúng theo ý thích của bạnphp artisan passport:install
3Phát hành mã thông báo truy cập
Sử dụng OAuth2 thông qua mã ủy quyền là cách mà hầu hết các nhà phát triển đều quen thuộc với OAuth2. Khi sử dụng mã ủy quyền, ứng dụng khách sẽ chuyển hướng người dùng đến máy chủ của bạn, nơi họ sẽ chấp thuận hoặc từ chối yêu cầu cấp mã thông báo truy cập cho ứng dụng khách
quản lý khách hàng
Đầu tiên, các nhà phát triển xây dựng ứng dụng cần tương tác với API của ứng dụng của bạn sẽ cần đăng ký ứng dụng của họ với ứng dụng của bạn bằng cách tạo một "ứng dụng khách". Thông thường, điều này bao gồm việc cung cấp tên ứng dụng của họ và URL mà ứng dụng của bạn có thể chuyển hướng đến sau khi người dùng chấp thuận yêu cầu cấp phép của họ
Lệnh php artisan passport:install
15
php artisan passport:install
Cách đơn giản nhất để tạo ứng dụng khách là sử dụng lệnh Artisan
php artisan passport:install
15. Lệnh này có thể được sử dụng để tạo ứng dụng khách của riêng bạn để kiểm tra chức năng OAuth2 của bạn. Khi bạn chạy lệnh php artisan passport:install
17, Passport sẽ nhắc bạn cung cấp thêm thông tin về khách hàng của bạn và sẽ cung cấp cho bạn ID khách hàng và bí mậtphp artisan passport:install
4URL chuyển hướng
Nếu bạn muốn cho phép nhiều URL chuyển hướng cho máy khách của mình, bạn có thể chỉ định chúng bằng cách sử dụng danh sách được phân cách bằng dấu phẩy khi được nhắc nhập URL bằng lệnh
php artisan passport:install
15. Bất kỳ URL nào chứa dấu phẩy phải được mã hóa URLphp artisan passport:install
5API JSON
Vì người dùng ứng dụng của bạn sẽ không thể sử dụng lệnh
php artisan passport:install
17, Passport cung cấp API JSON mà bạn có thể sử dụng để tạo ứng dụng khách. Điều này giúp bạn tránh khỏi rắc rối khi phải viết mã bộ điều khiển thủ công để tạo, cập nhật và xóa ứng dụng kháchTuy nhiên, bạn sẽ cần ghép nối API JSON của Passport với giao diện người dùng của riêng bạn để cung cấp bảng điều khiển cho người dùng của bạn quản lý khách hàng của họ. Dưới đây, chúng tôi sẽ xem xét tất cả các điểm cuối API để quản lý khách hàng. Để thuận tiện, chúng tôi sẽ sử dụng Axios để chứng minh việc thực hiện các yêu cầu HTTP tới các điểm cuối
API JSON được bảo vệ bởi phần mềm trung gian
php artisan passport:install
20 và php artisan passport:install
21; . Nó không thể được gọi từ một nguồn bên ngoàiphp artisan passport:install
22
php artisan passport:install
Tuyến này trả về tất cả các máy khách cho người dùng được xác thực. Điều này chủ yếu hữu ích để liệt kê tất cả các khách hàng của người dùng để họ có thể chỉnh sửa hoặc xóa chúng
php artisan passport:install
6php artisan passport:install
23
php artisan passport:install
Lộ trình này được sử dụng để tạo khách hàng mới. Nó yêu cầu hai mẩu dữ liệu. của khách hàng
php artisan passport:install
24 và một URL php artisan passport:install
25. URL php artisan passport:install
25 là nơi người dùng sẽ được chuyển hướng sau khi phê duyệt hoặc từ chối yêu cầu cấp phépKhi một khách hàng được tạo, nó sẽ được cấp ID khách hàng và bí mật khách hàng. Các giá trị này sẽ được sử dụng khi yêu cầu mã thông báo truy cập từ ứng dụng của bạn. Lộ trình tạo ứng dụng khách sẽ trả về phiên bản ứng dụng khách mới
php artisan passport:install
7php artisan passport:install
27
php artisan passport:install
Tuyến đường này được sử dụng để cập nhật khách hàng. Nó yêu cầu hai mẩu dữ liệu. của khách hàng
php artisan passport:install
24 và một URL php artisan passport:install
25. URL php artisan passport:install
25 là nơi người dùng sẽ được chuyển hướng sau khi phê duyệt hoặc từ chối yêu cầu cấp phép. Tuyến đường sẽ trả về phiên bản ứng dụng khách được cập nhậtphp artisan passport:install
8php artisan passport:install
31
php artisan passport:install
Tuyến đường này được sử dụng để xóa khách hàng
php artisan passport:install
9Yêu cầu mã thông báo
Chuyển hướng để ủy quyền
Khi ứng dụng khách đã được tạo, nhà phát triển có thể sử dụng ID ứng dụng khách và bí mật của họ để yêu cầu mã ủy quyền và mã thông báo truy cập từ ứng dụng của bạn. Đầu tiên, ứng dụng tiêu thụ phải thực hiện yêu cầu chuyển hướng đến tuyến đường
php artisan passport:install
32 của ứng dụng của bạn như vậy:withToken[getenv['TOKEN']]->post[...]00
Tham số
php artisan passport:install
33 có thể được sử dụng để chỉ định hành vi xác thực của ứng dụng Hộ chiếuNếu giá trị
php artisan passport:install
33 là php artisan passport:install
35, Hộ chiếu sẽ luôn đưa ra lỗi xác thực nếu người dùng chưa được xác thực với ứng dụng Hộ chiếu. Nếu giá trị là php artisan passport:install
36, Hộ chiếu sẽ luôn hiển thị màn hình phê duyệt ủy quyền, ngay cả khi tất cả các phạm vi trước đó đã được cấp cho ứng dụng tiêu dùng. Khi giá trị là php artisan passport:install
37, ứng dụng Hộ chiếu sẽ luôn nhắc người dùng đăng nhập lại vào ứng dụng, ngay cả khi họ đã có một phiên hiện cóNếu không có giá trị
php artisan passport:install
33 nào được cung cấp, người dùng sẽ chỉ được nhắc cấp quyền nếu trước đó họ chưa cấp quyền truy cập vào ứng dụng tiêu thụ cho các phạm vi được yêu cầuLưu ý
Hãy nhớ rằng tuyến đường32 đã được xác định bởi Hộ chiếu. Bạn không cần phải xác định tuyến đường này theo cách thủ công.
php artisan passport:install
Phê duyệt yêu cầu
Khi nhận được yêu cầu ủy quyền, Passport sẽ tự động phản hồi dựa trên giá trị của tham số
php artisan passport:install
33 [nếu có] và có thể hiển thị mẫu cho người dùng để họ phê duyệt hoặc từ chối yêu cầu ủy quyền. Nếu họ chấp thuận yêu cầu, họ sẽ được chuyển hướng trở lại php artisan passport:install
41 được chỉ định bởi ứng dụng tiêu thụ. php artisan passport:install
41 phải khớp với URL php artisan passport:install
25 đã được chỉ định khi tạo ứng dụng kháchNếu bạn muốn tùy chỉnh màn hình phê duyệt ủy quyền, bạn có thể xuất bản các chế độ xem của Hộ chiếu bằng cách sử dụng lệnh
composer require laravel/passport
24 Artisan. Các lượt xem đã xuất bản sẽ được đặt trong thư mục php artisan passport:install
45:withToken[getenv['TOKEN']]->post[...]01
Đôi khi, bạn có thể muốn bỏ qua lời nhắc ủy quyền, chẳng hạn như khi ủy quyền cho ứng dụng khách bên thứ nhất. Bạn có thể thực hiện điều này bằng cách xác định một phương thức
php artisan passport:install
47. Nếu php artisan passport:install
47 trả về php artisan passport:install
49, ứng dụng khách sẽ được phê duyệt và người dùng sẽ được chuyển hướng trở lại php artisan passport:install
41 ngay lập tức, trừ khi ứng dụng tiêu thụ đã đặt tham số php artisan passport:install
33 một cách rõ ràng khi chuyển hướng để cấp quyền:withToken[getenv['TOKEN']]->post[...]02
Chuyển đổi mã ủy quyền thành mã thông báo truy cập
Nếu người dùng chấp thuận yêu cầu ủy quyền, họ sẽ được chuyển hướng trở lại ứng dụng tiêu thụ. Trước tiên, người tiêu dùng nên xác minh tham số
php artisan passport:install
52 so với giá trị được lưu trữ trước khi chuyển hướng. Nếu tham số trạng thái khớp thì người tiêu dùng nên đưa ra yêu cầu php artisan passport:install
53 cho ứng dụng của bạn để yêu cầu mã thông báo truy cập. Yêu cầu phải bao gồm mã ủy quyền do ứng dụng của bạn cấp khi người dùng phê duyệt yêu cầu ủy quyền:withToken[getenv['TOKEN']]->post[...]03
Lộ trình
php artisan passport:install
54 này sẽ trả về phản hồi JSON chứa các thuộc tính php artisan passport:install
55, php artisan passport:install
56 và php artisan passport:install
57. Thuộc tính php artisan passport:install
57 chứa số giây cho đến khi mã thông báo truy cập hết hạnLưu ý
Giống như tuyến đường32, tuyến đường
php artisan passport:install
54 được xác định cho bạn theo Hộ chiếu. Không cần phải xác định tuyến đường này theo cách thủ công.
php artisan passport:install
API JSON
Hộ chiếu cũng bao gồm API JSON để quản lý mã thông báo truy cập được ủy quyền. Bạn có thể ghép nối điều này với giao diện người dùng của riêng mình để cung cấp cho người dùng của bạn một bảng điều khiển để quản lý mã thông báo truy cập. Để thuận tiện, chúng tôi sẽ sử dụng Axios để chứng minh việc thực hiện các yêu cầu HTTP tới các điểm cuối. API JSON được bảo vệ bởi phần mềm trung gian
php artisan passport:install
20 và php artisan passport:install
21; php artisan passport:install
63
php artisan passport:install
Tuyến này trả về tất cả các mã thông báo truy cập được ủy quyền mà người dùng được xác thực đã tạo. Điều này chủ yếu hữu ích để liệt kê tất cả các mã thông báo của người dùng để họ có thể thu hồi chúng
:withToken[getenv['TOKEN']]->post[...]04
php artisan passport:install
64
php artisan passport:install
Tuyến đường này có thể được sử dụng để thu hồi mã thông báo truy cập được ủy quyền và mã thông báo làm mới có liên quan của chúng
:withToken[getenv['TOKEN']]->post[...]05
Làm mới mã thông báo
Nếu ứng dụng của bạn phát hành mã thông báo truy cập ngắn hạn, người dùng sẽ cần làm mới mã thông báo truy cập của họ thông qua mã thông báo làm mới được cung cấp cho họ khi mã thông báo truy cập được cấp
:withToken[getenv['TOKEN']]->post[...]06
Lộ trình
php artisan passport:install
54 này sẽ trả về phản hồi JSON chứa các thuộc tính php artisan passport:install
55, php artisan passport:install
56 và php artisan passport:install
57. Thuộc tính php artisan passport:install
57 chứa số giây cho đến khi mã thông báo truy cập hết hạnThu hồi mã thông báo
Bạn có thể thu hồi mã thông báo bằng cách sử dụng phương pháp
php artisan passport:install
70 trên php artisan passport:install
71. Bạn có thể thu hồi mã thông báo làm mới của mã thông báo bằng phương pháp php artisan passport:install
72 trên php artisan passport:install
73. Các lớp này có thể được giải quyết bằng cách sử dụng bộ chứa dịch vụ của Laravel:withToken[getenv['TOKEN']]->post[...]07
Thanh lọc mã thông báo
Khi mã thông báo đã bị thu hồi hoặc hết hạn, bạn có thể muốn xóa chúng khỏi cơ sở dữ liệu. Hộ chiếu đi kèm với lệnh
php artisan passport:install
74 Artisan có thể làm điều này cho bạn:withToken[getenv['TOKEN']]->post[...]08
Bạn cũng có thể định cấu hình công việc đã lên lịch trong lớp
php artisan passport:install
75 của ứng dụng để tự động cắt bớt mã thông báo của bạn theo lịch trình:withToken[getenv['TOKEN']]->post[...]09
Cấp mã ủy quyền với PKCE
Cấp Mã ủy quyền với "Khóa chứng minh cho trao đổi mã" [PKCE] là một cách an toàn để xác thực các ứng dụng trang đơn hoặc ứng dụng gốc để truy cập API của bạn. Khoản trợ cấp này nên được sử dụng khi bạn không thể đảm bảo rằng bí mật của khách hàng sẽ được lưu trữ bảo mật hoặc để giảm thiểu nguy cơ bị kẻ tấn công chặn mã ủy quyền. Sự kết hợp giữa "trình xác minh mã" và "thử thách mã" sẽ thay thế bí mật ứng dụng khách khi trao đổi mã ủy quyền lấy mã thông báo truy cập
Tạo khách hàng
Trước khi ứng dụng của bạn có thể phát hành mã thông báo thông qua cấp mã ủy quyền với PKCE, bạn sẽ cần tạo ứng dụng khách hỗ trợ PKCE. Bạn có thể thực hiện việc này bằng lệnh Artisan
php artisan passport:install
15 với tùy chọn php artisan passport:install
77composer require laravel/passport
10Yêu cầu mã thông báo
Trình xác minh mã và Thử thách mã
Vì việc cấp quyền này không cung cấp bí mật ứng dụng khách, các nhà phát triển sẽ cần tạo kết hợp trình xác minh mã và thử thách mã để yêu cầu mã thông báo
Trình xác minh mã phải là một chuỗi ngẫu nhiên từ 43 đến 128 ký tự chứa các chữ cái, số và các ký tự
php artisan passport:install
78, php artisan passport:install
79, php artisan passport:install
80, php artisan passport:install
81, như được định nghĩa trong thông số kỹ thuật RFC 7636Thử thách mã phải là một chuỗi được mã hóa Base64 với URL và các ký tự an toàn cho tên tệp. Phải xóa các ký tự
php artisan passport:install
82 ở cuối và không có ngắt dòng, khoảng trắng hoặc các ký tự bổ sung kháccomposer require laravel/passport
11Chuyển hướng để ủy quyền
Khi ứng dụng khách đã được tạo, bạn có thể sử dụng ID ứng dụng khách và trình xác minh mã đã tạo và thử thách mã để yêu cầu mã ủy quyền và mã thông báo truy cập từ ứng dụng của bạn. Đầu tiên, ứng dụng tiêu thụ phải thực hiện yêu cầu chuyển hướng đến tuyến đường
php artisan passport:install
32 của ứng dụng của bạncomposer require laravel/passport
12Chuyển đổi mã ủy quyền thành mã thông báo truy cập
Nếu người dùng chấp thuận yêu cầu ủy quyền, họ sẽ được chuyển hướng trở lại ứng dụng tiêu thụ. Người tiêu dùng nên xác minh tham số
php artisan passport:install
52 đối với giá trị đã được lưu trữ trước khi chuyển hướng, như trong Cấp mã ủy quyền tiêu chuẩnNếu tham số trạng thái khớp, người tiêu dùng nên đưa ra yêu cầu
php artisan passport:install
53 cho ứng dụng của bạn để yêu cầu mã thông báo truy cập. Yêu cầu phải bao gồm mã ủy quyền do ứng dụng của bạn cấp khi người dùng phê duyệt yêu cầu ủy quyền cùng với trình xác minh mã được tạo ban đầucomposer require laravel/passport
13Mã thông báo cấp mật khẩu
Cảnh báo
Chúng tôi khuyên bạn không nên sử dụng mã thông báo cấp mật khẩu nữa. Thay vào đó, bạn nên chọn loại cấp phép hiện đang được Máy chủ OAuth2 khuyến nghị.
Cấp mật khẩu OAuth2 cho phép các ứng dụng khách bên thứ nhất khác của bạn, chẳng hạn như ứng dụng dành cho thiết bị di động, nhận mã thông báo truy cập bằng địa chỉ email/tên người dùng và mật khẩu. Điều này cho phép bạn cấp mã thông báo truy cập một cách an toàn cho khách hàng bên thứ nhất mà không yêu cầu người dùng của bạn thực hiện toàn bộ quy trình chuyển hướng mã ủy quyền OAuth2
Tạo ứng dụng khách cấp mật khẩu
Trước khi ứng dụng của bạn có thể cấp mã thông báo thông qua cấp mật khẩu, bạn sẽ cần tạo ứng dụng khách cấp mật khẩu. Bạn có thể thực hiện việc này bằng cách sử dụng lệnh Artisan
php artisan passport:install
15 với tùy chọn php artisan passport:install
87. Nếu bạn đã chạy lệnh php artisan vendor:publish --tag=passport-migrations
3 rồi thì không cần chạy lệnh nàycomposer require laravel/passport
14Yêu cầu mã thông báo
Khi bạn đã tạo ứng dụng khách cấp mật khẩu, bạn có thể yêu cầu mã thông báo truy cập bằng cách đưa ra yêu cầu
php artisan passport:install
53 cho tuyến đường php artisan passport:install
54 với địa chỉ email và mật khẩu của người dùng. Nhớ là route này đã được đăng ký bằng Passport rồi nên không cần phải xác định thủ công. Nếu yêu cầu thành công, bạn sẽ nhận được một php artisan passport:install
55 và php artisan passport:install
56 trong phản hồi JSON từ máy chủcomposer require laravel/passport
15Lưu ý
Hãy nhớ rằng, mã thông báo truy cập tồn tại lâu dài theo mặc định. Tuy nhiên, bạn có thể tự do nếu cần.
Yêu cầu tất cả các phạm vi
Khi sử dụng quyền cấp mật khẩu hoặc cấp thông tin xác thực ứng dụng khách, bạn có thể muốn ủy quyền mã thông báo cho tất cả các phạm vi được ứng dụng của bạn hỗ trợ. Bạn có thể làm điều này bằng cách yêu cầu phạm vi
php artisan passport:install
93. Nếu bạn yêu cầu phạm vi php artisan passport:install
93, phương thức php artisan passport:install
95 trên phiên bản mã thông báo sẽ luôn trả về php artisan passport:install
49. Phạm vi này chỉ có thể được chỉ định cho một mã thông báo được cấp bằng khoản trợ cấp php artisan passport:install
97 hoặc php artisan passport:install
98composer require laravel/passport
15Tùy chỉnh Nhà cung cấp Người dùng
Nếu ứng dụng của bạn sử dụng nhiều hơn một , bạn có thể chỉ định nhà cung cấp người dùng nào mà ứng dụng khách cấp mật khẩu sử dụng bằng cách cung cấp tùy chọn
php artisan passport:install
99 khi tạo ứng dụng khách thông qua lệnh :withToken[getenv['TOKEN']]->post[...]000. Tên nhà cung cấp đã cho phải khớp với nhà cung cấp hợp lệ được xác định trong tệp cấu hình
:withToken[getenv['TOKEN']]->post[...]10 của ứng dụng của bạn. Sau đó, bạn có thể đảm bảo rằng chỉ những người dùng từ nhà cung cấp được chỉ định của người bảo vệ mới được ủy quyền
Tùy chỉnh trường tên người dùng
Khi xác thực bằng cấp mật khẩu, Hộ chiếu sẽ sử dụng thuộc tính
:withToken[getenv['TOKEN']]->post[...]002 của mô hình có thể xác thực của bạn làm "tên người dùng". Tuy nhiên, bạn có thể tùy chỉnh hành vi này bằng cách xác định phương thức
:withToken[getenv['TOKEN']]->post[...]003 trên mô hình của mình
composer require laravel/passport
17Tùy chỉnh xác thực mật khẩu
Khi xác thực bằng cấp mật khẩu, Passport sẽ sử dụng thuộc tính
php artisan passport:install
97 của mô hình của bạn để xác thực mật khẩu đã cho. Nếu mô hình của bạn không có thuộc tính php artisan passport:install
97 hoặc bạn muốn tùy chỉnh logic xác thực mật khẩu, bạn có thể xác định phương thức :withToken[getenv['TOKEN']]->post[...]006 trên mô hình của mình
composer require laravel/passport
18Mã thông báo tài trợ tiềm ẩn
Cảnh báo
Chúng tôi khuyên bạn không nên sử dụng mã thông báo cấp ngầm định nữa. Thay vào đó, bạn nên chọn loại cấp phép hiện đang được Máy chủ OAuth2 khuyến nghị.
Cấp ngầm tương tự như cấp mã ủy quyền; . Khoản trợ cấp này được sử dụng phổ biến nhất cho các ứng dụng JavaScript hoặc thiết bị di động nơi không thể lưu trữ thông tin đăng nhập của khách hàng một cách an toàn. Để kích hoạt khoản trợ cấp, hãy gọi phương thức
:withToken[getenv['TOKEN']]->post[...]007 trong phương thức
composer require laravel/passport
22 của lớp composer require laravel/passport
23 trong ứng dụng của bạncomposer require laravel/passport
19Khi khoản trợ cấp đã được bật, nhà phát triển có thể sử dụng ID khách hàng của họ để yêu cầu mã thông báo truy cập từ ứng dụng của bạn. Ứng dụng tiêu thụ sẽ thực hiện yêu cầu chuyển hướng đến tuyến đường
php artisan passport:install
32 của ứng dụng của bạn như vậycomposer require laravel/passport
60Lưu ý
Hãy nhớ rằng tuyến đường32 đã được xác định bởi Hộ chiếu. Bạn không cần phải xác định tuyến đường này theo cách thủ công.
php artisan passport:install
Thông tin xác thực của khách hàng Cấp mã thông báo
Cấp thông tin đăng nhập máy khách phù hợp để xác thực giữa các máy. Ví dụ: bạn có thể sử dụng khoản trợ cấp này trong một công việc đã lên lịch đang thực hiện các tác vụ bảo trì qua API
Trước khi ứng dụng của bạn có thể phát hành mã thông báo thông qua cấp thông tin xác thực ứng dụng khách, bạn sẽ cần tạo ứng dụng khách cấp thông tin xác thực ứng dụng khách. Bạn có thể làm điều này bằng cách sử dụng tùy chọn
:withToken[getenv['TOKEN']]->post[...]012 của lệnh Artisan
php artisan passport:install
15composer require laravel/passport
61Tiếp theo, để sử dụng loại trợ cấp này, bạn cần thêm phần mềm trung gian
:withToken[getenv['TOKEN']]->post[...]014 vào thuộc tính
:withToken[getenv['TOKEN']]->post[...]015 trong tệp
:withToken[getenv['TOKEN']]->post[...]016 của mình
composer require laravel/passport
62Sau đó, đính kèm phần mềm trung gian vào một tuyến đường
composer require laravel/passport
63Để hạn chế quyền truy cập vào tuyến đường đối với các phạm vi cụ thể, bạn có thể cung cấp danh sách các phạm vi bắt buộc được phân tách bằng dấu phẩy khi đính kèm phần mềm trung gian
php artisan passport:install
17 vào tuyến đườngcomposer require laravel/passport
64Truy xuất mã thông báo
Để truy xuất mã thông báo bằng cách sử dụng loại trợ cấp này, hãy gửi yêu cầu tới điểm cuối
:withToken[getenv['TOKEN']]->post[...]018
composer require laravel/passport
65Mã thông báo truy cập cá nhân
Đôi khi, người dùng của bạn có thể muốn cấp mã thông báo truy cập cho chính họ mà không cần thông qua quy trình chuyển hướng mã ủy quyền điển hình. Việc cho phép người dùng cấp mã thông báo cho chính họ thông qua giao diện người dùng của ứng dụng của bạn có thể hữu ích để cho phép người dùng thử nghiệm với API của bạn hoặc có thể dùng như một cách tiếp cận đơn giản hơn để cấp mã thông báo truy cập nói chung
Lưu ý
Nếu ứng dụng của bạn chủ yếu sử dụng Passport để cấp mã thông báo truy cập cá nhân, hãy cân nhắc sử dụng Laravel Sanctum, thư viện bên thứ nhất gọn nhẹ của Laravel để cấp mã thông báo truy cập API.
Tạo một ứng dụng khách truy cập cá nhân
Trước khi ứng dụng của bạn có thể phát hành mã thông báo truy cập cá nhân, bạn sẽ cần tạo ứng dụng khách truy cập cá nhân. Bạn có thể thực hiện việc này bằng cách thực hiện lệnh Artisan
php artisan passport:install
15 với tùy chọn :withToken[getenv['TOKEN']]->post[...]020. Nếu bạn đã chạy lệnh
php artisan vendor:publish --tag=passport-migrations
3 rồi thì không cần chạy lệnh nàycomposer require laravel/passport
66Sau khi tạo ứng dụng khách truy cập cá nhân của bạn, hãy đặt ID của ứng dụng khách và giá trị bí mật văn bản thuần túy vào tệp
:withToken[getenv['TOKEN']]->post[...]022 của ứng dụng của bạn
composer require laravel/passport
67Quản lý mã thông báo truy cập cá nhân
Khi bạn đã tạo một ứng dụng khách truy cập cá nhân, bạn có thể phát hành mã thông báo cho một người dùng nhất định bằng cách sử dụng phương pháp
:withToken[getenv['TOKEN']]->post[...]023 trên phiên bản mô hình
php artisan vendor:publish --tag=passport-migrations
8. Phương thức :withToken[getenv['TOKEN']]->post[...]023 chấp nhận tên của mã thông báo làm đối số đầu tiên và một mảng tùy chọn làm đối số thứ hai
composer require laravel/passport
68API JSON
Hộ chiếu cũng bao gồm API JSON để quản lý mã thông báo truy cập cá nhân. Bạn có thể ghép nối điều này với giao diện người dùng của riêng mình để cung cấp cho người dùng của bạn một bảng điều khiển để quản lý mã thông báo truy cập cá nhân. Dưới đây, chúng tôi sẽ xem xét tất cả các điểm cuối API để quản lý mã thông báo truy cập cá nhân. Để thuận tiện, chúng tôi sẽ sử dụng Axios để chứng minh việc thực hiện các yêu cầu HTTP tới các điểm cuối
API JSON được bảo vệ bởi phần mềm trung gian
php artisan passport:install
20 và php artisan passport:install
21; . Nó không thể được gọi từ một nguồn bên ngoài:withToken[getenv['TOKEN']]->post[...]
028
Lộ trình này trả về tất cả các định nghĩa cho ứng dụng của bạn. Bạn có thể sử dụng tuyến đường này để liệt kê các phạm vi mà người dùng có thể chỉ định cho mã thông báo truy cập cá nhân
composer require laravel/passport
69:withToken[getenv['TOKEN']]->post[...]
029
Lộ trình này trả về tất cả các mã thông báo truy cập cá nhân mà người dùng được xác thực đã tạo. Điều này chủ yếu hữu ích để liệt kê tất cả các mã thông báo của người dùng để họ có thể chỉnh sửa hoặc thu hồi chúng
composer require laravel/passport
80:withToken[getenv['TOKEN']]->post[...]
030
Lộ trình này tạo mã thông báo truy cập cá nhân mới. Nó yêu cầu hai mẩu dữ liệu.
php artisan passport:install
24 của mã thông báo và :withToken[getenv['TOKEN']]->post[...]032 sẽ được gán cho mã thông báo
composer require laravel/passport
81:withToken[getenv['TOKEN']]->post[...]
033
Tuyến đường này có thể được sử dụng để thu hồi mã thông báo truy cập cá nhân
composer require laravel/passport
82Bảo vệ tuyến đường
Qua phần mềm trung gian
Hộ chiếu bao gồm một thẻ sẽ xác thực mã thông báo truy cập đối với các yêu cầu đến. Khi bạn đã định cấu hình trình bảo vệ
:withToken[getenv['TOKEN']]->post[...]11 để sử dụng trình điều khiển
:withToken[getenv['TOKEN']]->post[...]13, bạn chỉ cần chỉ định phần mềm trung gian
:withToken[getenv['TOKEN']]->post[...]036 trên bất kỳ tuyến đường nào cần có mã thông báo truy cập hợp lệ
composer require laravel/passport
83Cảnh báo
Nếu bạn đang sử dụng , bạn nên sử dụng để bảo vệ tuyến đường của mình thay vì phần mềm trung gian:withToken[getenv['TOKEN']]->post[...]036.
Nhiều bảo vệ xác thực
Nếu ứng dụng của bạn xác thực các loại người dùng khác nhau có thể sử dụng các mô hình Eloquent hoàn toàn khác nhau, bạn có thể cần xác định cấu hình bảo vệ cho từng loại nhà cung cấp người dùng trong ứng dụng của mình. Điều này cho phép bạn bảo vệ các yêu cầu dành cho nhà cung cấp người dùng cụ thể. Ví dụ: với cấu hình bảo vệ sau, tệp cấu hình
:withToken[getenv['TOKEN']]->post[...]10
Lộ trình sau sẽ sử dụng bộ bảo vệ
:withToken[getenv['TOKEN']]->post[...]040, sử dụng nhà cung cấp người dùng
:withToken[getenv['TOKEN']]->post[...]041, để xác thực các yêu cầu đến
composer require laravel/passport
84Lưu ý
Để biết thêm thông tin về việc sử dụng nhiều nhà cung cấp người dùng với Hộ chiếu, vui lòng tham khảo.
Chuyển mã thông báo truy cập
Khi gọi các tuyến đường được bảo vệ bởi Hộ chiếu, người tiêu dùng API của ứng dụng của bạn nên chỉ định mã thông báo truy cập của họ dưới dạng mã thông báo
:withToken[getenv['TOKEN']]->post[...]042 trong tiêu đề
:withToken[getenv['TOKEN']]->post[...]043 của yêu cầu của họ. Ví dụ khi sử dụng thư viện Guzzle HTTP
composer require laravel/passport
85Phạm vi mã thông báo
Phạm vi cho phép ứng dụng khách API của bạn yêu cầu một nhóm quyền cụ thể khi yêu cầu cấp quyền truy cập tài khoản. Ví dụ: nếu bạn đang xây dựng ứng dụng thương mại điện tử, không phải tất cả người tiêu dùng API đều cần khả năng đặt hàng. Thay vào đó, bạn có thể cho phép người tiêu dùng chỉ yêu cầu ủy quyền để truy cập trạng thái giao hàng của đơn đặt hàng. Nói cách khác, phạm vi cho phép người dùng ứng dụng của bạn giới hạn các hành động mà ứng dụng bên thứ ba có thể thực hiện thay mặt họ
Xác định phạm vi
Bạn có thể xác định phạm vi API của mình bằng cách sử dụng phương thức
:withToken[getenv['TOKEN']]->post[...]044 trong phương thức
composer require laravel/passport
22 của lớp composer require laravel/passport
23 trong ứng dụng của bạn. Phương thức :withToken[getenv['TOKEN']]->post[...]047 chấp nhận một mảng tên phạm vi và mô tả phạm vi. Mô tả phạm vi có thể là bất kỳ thứ gì bạn muốn và sẽ được hiển thị cho người dùng trên màn hình phê duyệt ủy quyền
composer require laravel/passport
86Phạm vi mặc định
Nếu khách hàng không yêu cầu bất kỳ phạm vi cụ thể nào, bạn có thể định cấu hình máy chủ Hộ chiếu của mình để đính kèm [các] phạm vi mặc định vào mã thông báo bằng phương pháp
:withToken[getenv['TOKEN']]->post[...]048. Thông thường, bạn nên gọi phương thức này từ phương thức
composer require laravel/passport
22 của lớp composer require laravel/passport
23 trong ứng dụng của bạncomposer require laravel/passport
87Lưu ý Phạm vi mặc định của Hộ chiếu không áp dụng cho mã thông báo truy cập cá nhân được tạo bởi người dùng
Chỉ định phạm vi cho mã thông báo
Khi yêu cầu mã ủy quyền
Khi yêu cầu mã thông báo truy cập bằng cách sử dụng cấp mã ủy quyền, người tiêu dùng nên chỉ định phạm vi mong muốn của họ dưới dạng tham số chuỗi truy vấn
:withToken[getenv['TOKEN']]->post[...]051. Tham số
:withToken[getenv['TOKEN']]->post[...]051 phải là danh sách phạm vi được phân tách bằng dấu cách
composer require laravel/passport
88Khi phát hành Mã thông báo truy cập cá nhân
Nếu bạn đang phát hành mã thông báo truy cập cá nhân bằng phương pháp
:withToken[getenv['TOKEN']]->post[...]023 của mô hình
php artisan vendor:publish --tag=passport-migrations
8, bạn có thể chuyển mảng các phạm vi mong muốn làm đối số thứ hai cho phương thứccomposer require laravel/passport
89Kiểm tra phạm vi
Hộ chiếu bao gồm hai phần mềm trung gian có thể được sử dụng để xác minh rằng yêu cầu đến được xác thực bằng mã thông báo đã được cấp một phạm vi nhất định. Để bắt đầu, hãy thêm phần mềm trung gian sau vào thuộc tính
:withToken[getenv['TOKEN']]->post[...]015 của tệp
:withToken[getenv['TOKEN']]->post[...]016 của bạn
composer require laravel/passport
90Kiểm tra tất cả các phạm vi
Phần mềm trung gian
:withToken[getenv['TOKEN']]->post[...]032 có thể được gán cho một tuyến để xác minh rằng mã thông báo truy cập của yêu cầu đến có tất cả các phạm vi được liệt kê
composer require laravel/passport
91Kiểm tra mọi phạm vi
Phần mềm trung gian
:withToken[getenv['TOKEN']]->post[...]051 có thể được gán cho một tuyến để xác minh rằng mã thông báo truy cập của yêu cầu đến có ít nhất một trong các phạm vi được liệt kê
composer require laravel/passport
92Kiểm tra phạm vi trên phiên bản mã thông báo
Sau khi yêu cầu xác thực mã thông báo truy cập đã được đưa vào ứng dụng của bạn, bạn vẫn có thể kiểm tra xem mã thông báo có phạm vi nhất định hay không bằng cách sử dụng phương thức
:withToken[getenv['TOKEN']]->post[...]059 trên phiên bản
php artisan vendor:publish --tag=passport-migrations
8 đã xác thựccomposer require laravel/passport
93Phương pháp phạm vi bổ sung
Phương thức
:withToken[getenv['TOKEN']]->post[...]061 sẽ trả về một mảng gồm tất cả các ID/tên đã xác định
composer require laravel/passport
94Phương thức
:withToken[getenv['TOKEN']]->post[...]032 sẽ trả về một mảng gồm tất cả các phạm vi được xác định dưới dạng các phiên bản của
:withToken[getenv['TOKEN']]->post[...]063
Phương thức
:withToken[getenv['TOKEN']]->post[...]064 sẽ trả về một mảng gồm các phiên bản
:withToken[getenv['TOKEN']]->post[...]063 khớp với các ID/tên đã cho
composer require laravel/passport
95Bạn có thể xác định xem một phạm vi nhất định đã được xác định hay chưa bằng cách sử dụng phương pháp
:withToken[getenv['TOKEN']]->post[...]066
composer require laravel/passport
96Sử dụng API của bạn với JavaScript
Khi xây dựng API, việc có thể sử dụng API của riêng bạn từ ứng dụng JavaScript của bạn có thể cực kỳ hữu ích. Cách tiếp cận phát triển API này cho phép ứng dụng của riêng bạn sử dụng cùng một API mà bạn đang chia sẻ với mọi người. Ứng dụng web, ứng dụng dành cho thiết bị di động, ứng dụng của bên thứ ba và bất kỳ SDK nào mà bạn có thể xuất bản trên các trình quản lý gói khác nhau đều có thể sử dụng cùng một API
Thông thường, nếu bạn muốn sử dụng API từ ứng dụng JavaScript của mình, bạn cần gửi mã thông báo truy cập đến ứng dụng theo cách thủ công và chuyển nó cùng với mỗi yêu cầu đến ứng dụng của bạn. Tuy nhiên, Passport bao gồm một phần mềm trung gian có thể xử lý việc này cho bạn. Tất cả những gì bạn cần làm là thêm phần mềm trung gian
:withToken[getenv['TOKEN']]->post[...]067 vào nhóm phần mềm trung gian
php artisan passport:install
20 trong tệp :withToken[getenv['TOKEN']]->post[...]016 của bạn
composer require laravel/passport
97Cảnh báo
Bạn nên đảm bảo rằng phần mềm trung gian:withToken[getenv['TOKEN']]->post[...]067 là phần mềm trung gian cuối cùng được liệt kê trong ngăn xếp phần mềm trung gian của bạn.
Phần mềm trung gian này sẽ đính kèm cookie
:withToken[getenv['TOKEN']]->post[...]071 vào phản hồi gửi đi của bạn. Cookie này chứa JWT được mã hóa mà Passport sẽ sử dụng để xác thực các yêu cầu API từ ứng dụng JavaScript của bạn. JWT có thời gian tồn tại bằng giá trị cấu hình
:withToken[getenv['TOKEN']]->post[...]072 của bạn. Bây giờ, vì trình duyệt sẽ tự động gửi cookie với tất cả các yêu cầu tiếp theo, nên bạn có thể đưa ra các yêu cầu tới API của ứng dụng của mình mà không cần chuyển mã thông báo truy cập một cách rõ ràng
composer require laravel/passport
98Tùy chỉnh tên cookie
Nếu cần, bạn có thể tùy chỉnh tên của cookie
:withToken[getenv['TOKEN']]->post[...]071 bằng phương pháp
:withToken[getenv['TOKEN']]->post[...]074. Thông thường, phương thức này nên được gọi từ phương thức
composer require laravel/passport
22 của lớp composer require laravel/passport
23 trong ứng dụng của bạncomposer require laravel/passport
99Bảo vệ CSRF
Khi sử dụng phương thức xác thực này, bạn cần đảm bảo tiêu đề mã thông báo CSRF hợp lệ được đưa vào yêu cầu của bạn. Khung JavaScript Laravel mặc định bao gồm một phiên bản Axios, phiên bản này sẽ tự động sử dụng giá trị cookie
:withToken[getenv['TOKEN']]->post[...]077 được mã hóa để gửi tiêu đề
:withToken[getenv['TOKEN']]->post[...]078 cho các yêu cầu cùng nguồn gốc
Lưu ý
Nếu bạn chọn gửi tiêu đề:withToken[getenv['TOKEN']]->post[...]079 thay vì:withToken[getenv['TOKEN']]->post[...]078, bạn sẽ cần sử dụng mã thông báo không được mã hóa do:withToken[getenv['TOKEN']]->post[...]081 cung cấp.
Sự kiện
Hộ chiếu tăng sự kiện khi phát hành mã thông báo truy cập và làm mới mã thông báo. Bạn có thể sử dụng các sự kiện này để cắt bớt hoặc thu hồi các mã thông báo truy cập khác trong cơ sở dữ liệu của mình. Nếu muốn, bạn có thể đính kèm người nghe vào các sự kiện này trong lớp
:withToken[getenv['TOKEN']]->post[...]082 của ứng dụng của bạn
php artisan vendor:publish --tag=passport-migrations
0thử nghiệm
Phương pháp
:withToken[getenv['TOKEN']]->post[...]083 của hộ chiếu có thể được sử dụng để chỉ định người dùng hiện được xác thực cũng như phạm vi của nó. Đối số đầu tiên được cung cấp cho phương thức
:withToken[getenv['TOKEN']]->post[...]083 là phiên bản người dùng và đối số thứ hai là một mảng phạm vi sẽ được cấp cho mã thông báo của người dùng
php artisan vendor:publish --tag=passport-migrations
1Phương pháp
:withToken[getenv['TOKEN']]->post[...]085 của hộ chiếu có thể được sử dụng để chỉ định ứng dụng khách hiện được xác thực cũng như phạm vi của nó. Đối số đầu tiên được cung cấp cho phương thức
:withToken[getenv['TOKEN']]->post[...]085 là phiên bản ứng dụng khách và đối số thứ hai là một mảng phạm vi sẽ được cấp cho mã thông báo của ứng dụng khách