Tìm hiểu về cách sử dụng và quản lý khoá API cho Firebase
Sử dụng bộ sưu tập để sắp xếp ngăn nắp các trang
Lưu và phân loại nội dung dựa trên lựa chọn ưu tiên của bạn.
Khoá API là một chuỗi duy nhất dùng để định tuyến các yêu cầu đến dự án Firebase khi tương tác với Firebase và các dịch vụ của Google. Trang này mô tả
thông tin cơ bản về khoá API cũng như các phương pháp hay nhất để sử dụng và
quản lý khoá API bằng ứng dụng Firebase.
Thông tin chung về khoá API và Firebase
Khoá API cho Firebase khác với khoá API thông thường
Không giống như cách sử dụng khoá API thường, khoá API cho các dịch vụ Firebase không được dùng để kiểm soát quyền truy cập vào tài nguyên phụ trợ; điều đó chỉ có thể được thực hiện bằng Quy tắc bảo mật Firebase (để kiểm soát người dùng cuối nào có thể truy cập vào tài nguyên) và tính năng Kiểm tra ứng dụng Firebase (để kiểm soát ứng dụng nào có thể truy cập vào tài nguyên).
Thông thường, bạn cần bảo vệ nhanh chóng các khoá API (ví dụ: bằng cách sử dụng dịch vụ kho lưu trữ hoặc đặt các khoá này làm biến môi trường). Tuy nhiên, bạn có thể đưa khoá API cho các dịch vụ Firebase vào mã hoặc tệp cấu hình đã đăng ký.
Bạn có thể xem và quản lý tất cả các khoá API của dự án trong bảng điều khiển API và dịch vụ > Thông tin xác thực trong bảng điều khiển Google Cloud.
Bạn cũng có thể tìm thấy khoá API được tự động so khớp với một ứng dụng Firebase ở những vị trí sau. Theo mặc định, tất cả các Ứng dụng Firebase của dự án cho cùng một nền tảng (Apple so với Android và Web) sẽ sử dụng cùng một khoá API.
Ứng dụng Firebase dành cho Apple – Tìm khoá API được tự động so khớp trong tệp cấu hình Firebase, GoogleService-Info.plist, trong trường API_KEY.
Ứng dụng Firebase dành cho Android – Tìm khoá API được tự động so khớp trong tệp cấu hình Firebase, google-services.json, trong trường current_key.
Ứng dụng web Firebase – Tìm khoá API được tự động so khớp trong đối tượng cấu hình Firebase, trong trường apiKey.
Sử dụng khoá API
Khoá API được dùng để xác định dự án Firebase của bạn khi tương tác với các dịch vụ Firebase/Google. Cụ thể, chúng dùng để liên kết các yêu cầu API với dự án của bạn về hạn mức và hoạt động thanh toán. Các API này cũng hữu ích khi truy cập dữ liệu công khai.
Ví dụ: bạn có thể sử dụng khoá API một cách rõ ràng bằng cách chuyển giá trị của khoá đó vào lệnh gọi API REST dưới dạng tham số truy vấn. Dưới đây là ví dụ minh hoạ cách bạn có thể gửi yêu cầu đến API trình liên kết đường liên kết động:
POST https://firebasedynamiclinks.googleapis.com/v1/shortLinks?key=API_KEY
Khi ứng dụng của bạn thực hiện lệnh gọi đến một API Firebase đòi hỏi khoá API do ứng dụng dành cho thiết bị di động/web cung cấp, ứng dụng sẽ tự động tìm khoá/đối tượng cấu hình Firebase cho khoá API của dự án. Tuy nhiên, bạn có thể cung cấp khoá API cho ứng dụng của mình bằng cách sử dụng một cơ chế khác, bao gồm cả các biến môi trường.
Xem xét và áp dụng các quy định hạn chế phù hợp cho khoá API (nên áp dụng)
Mặc dù không nhất thiết phải coi khoá API cho các dịch vụ Firebase là bí mật, nhưng bạn nên xem xét và áp dụng các hạn chế và giới hạn như mô tả trong phần này.
Xem xét những API được tự động thêm vào danh sách cho phép cho khoá API Firebase
Khi Firebase tạo một khoá API trong dự án của bạn, chúng tôi sẽ tự động thêm "Hạn chế API" vào khoá đó. Các API được thêm vào danh sách cho phép này là các API liên quan đến Firebase. Các API này yêu cầu ứng dụng cung cấp một khoá API cùng với lệnh gọi. Xin lưu ý rằng hầu hết các API cần thiết để sử dụng dịch vụ Firebase không thực sự cần nằm trong danh sách cho phép đối với các khoá API của bạn.
Vì Firebase thêm các API cần thiết cho tất cả dịch vụ Firebase, nên danh sách cho phép cho một khoá API có thể bao gồm các API cho những sản phẩm mà bạn không sử dụng.
Bạn có thể xoá API khỏi danh sách cho phép, nhưng bạn phải cẩn thận để không xoá các API bắt buộc đối với Firebase và dịch vụ Firebase mà bạn sử dụng (xem danh sách các API liên quan đến Firebase cần có trong danh sách cho phép của từng dịch vụ / sản phẩm). Nếu không, bạn sẽ gặp lỗi khi thực hiện lệnh gọi đến các dịch vụ Firebase.
Thắt chặt hạn mức nếu bạn dùng phương thức Xác thực dựa trên mật khẩu
Nếu bạn sử dụng tính năng Xác thực Firebase dựa trên mật khẩu và ai đó có được khoá API của bạn, thì họ sẽ không thể truy cập vào bất kỳ cơ sở dữ liệu nào của dự án Firebase hoặc dữ liệu Cloud Storage miễn là dữ liệu này được bảo vệ theo Quy tắc bảo mật Firebase. Tuy nhiên, họ có thể sử dụng khoá API để truy cập các điểm cuối xác thực của Firebase và đưa ra yêu cầu xác thực đối với dự án của bạn.
Để giảm thiểu khả năng ai đó sử dụng sai khoá API nhằm tìm cách tấn công brute force, bạn có thể thắt chặt hạn mức mặc định của điểm cuối identitytoolkit.googleapis.com để phản ánh kỳ vọng bình thường về lưu lượng truy cập của ứng dụng. Xin lưu ý rằng nếu bạn thu hẹp hạn mức này và ứng dụng của bạn đột ngột có thêm người dùng, bạn có thể gặp lỗi đăng nhập cho đến khi bạn tăng hạn mức.
Bạn có thể thay đổi hạn mức API của dự án trong bảng điều khiển Google Cloud.
Sử dụng các khoá API riêng biệt bị hạn chế cho mọi dịch vụ không phải Firebase
Mặc dù thường không cần phải coi khoá API sử dụng cho các dịch vụ Firebase là khoá bí mật, nhưng bạn nên có thêm một số biện pháp phòng ngừa đối với khoá API mà bạn sử dụng với các API khác của Google Cloud.
Nếu sử dụng Google Cloud API (trên bất kỳ nền tảng nào) không dành cho dịch vụ / sản phẩm Firebase, bạn nên tạo các khoá API riêng biệt bị hạn chế để sử dụng với các API đó. Điều này đặc biệt quan trọng nếu API này dành cho một dịch vụ Google Cloud có tính phí.
Ví dụ: nếu sử dụng Firebase ML và Cloud Vision API trên iOS, bạn nên tạo các khoá API riêng mà bạn chỉ dùng để truy cập vào Cloud Vision API.
Bằng cách sử dụng các khoá API riêng biệt, bị hạn chế cho API không phải Firebase, bạn có thể xoay vòng hoặc thay thế các khoá khi cần và thêm các hạn chế bổ sung cho khoá API mà không làm gián đoạn việc sử dụng dịch vụ Firebase.
Xem hướng dẫn tạo khoá dành riêng cho API
Những hướng dẫn này mô tả cách tạo khoá API riêng biệt bị hạn chế cho một API giả có tên là Super Service API.
Bước 1: Định cấu hình các khoá API hiện có để không cho phép truy cập vào Super Service API
Mở trang Thông tin xác thực của bảng điều khiển Google Cloud. Khi thấy thông báo, hãy chọn dự án của bạn.
Đối với mỗi khoá API hiện có trong danh sách, hãy mở chế độ xem chỉnh sửa.
Trong phần APIRestrict (Hạn chế API), hãy chọn Restrict key (Hạn chế khoá), sau đó thêm vào danh sách tất cả API mà bạn muốn khoá API có quyền truy cập. Hãy nhớ không bao gồm API mà bạn đang tạo một khoá API riêng biệt (trong ví dụ này là Super Service API).
Khi định cấu hình các quy định hạn chế về API của khoá API, bạn sẽ khai báo rõ ràng các API mà khoá đó có quyền truy cập. Theo mặc định, khi phần Hạn chế API chọn Không hạn chế khoá, bạn có thể dùng khoá API để truy cập vào bất kỳ API nào đã được bật cho dự án.
Giờ đây, các khoá API hiện có của bạn sẽ không cấp quyền truy cập vào Super Service API, nhưng mỗi khoá sẽ tiếp tục hoạt động đối với mọi API mà bạn đã thêm vào danh sách các hạn chế về API.
Bước 2: Tạo và sử dụng khoá API mới để truy cập vào Super Service API
Quay lại trang Thông tin xác thực. Hãy đảm bảo dự án Firebase của bạn vẫn đang được chọn.
Nhấp vào Tạo thông tin xác thực > Khoá API. Ghi lại khoá API mới, sau đó nhấp vào Restrict key (Hạn chế khoá).
Trong phần APIRestrict (Hạn chế API), hãy chọn Restrict key (Hạn chế khoá), sau đó thêm vào danh sách onlySuper Service API.
Khoá API mới này chỉ cấp quyền truy cập vào Super Service API.
Định cấu hình ứng dụng và dịch vụ của bạn để sử dụng khoá API mới.
Sử dụng khoá API theo môi trường cụ thể (nên dùng)
Nếu bạn thiết lập nhiều dự án Firebase cho nhiều môi trường, chẳng hạn như thử nghiệm và sản xuất, thì điều quan trọng là mỗi thực thể ứng dụng phải tương tác với dự án Firebase tương ứng. Ví dụ: thực thể ứng dụng thử nghiệm sẽ không bao giờ được trao đổi với dự án Firebase chính thức. Điều này cũng có nghĩa là ứng dụng thử nghiệm cần sử dụng khoá API được liên kết với dự án Firebase thử nghiệm.
Để giảm thiểu các vấn đề thúc đẩy việc thay đổi mã từ quá trình phát triển, thử nghiệm đến sản xuất, thay vì đưa khoá API vào chính mã, hãy đặt các khoá đó làm biến môi trường hoặc đưa các khoá đó vào tệp cấu hình.
Xin lưu ý rằng nếu đang sử dụng Bộ trình mô phỏng cục bộ Firebase để phát triển cùng với công nghệ học máy Firebase, bạn phải tạo và sử dụng khoá API chỉ dùng để gỡ lỗi. Bạn có thể xem hướng dẫn về cách tạo loại khoá đó trong các tài liệu về học máy của Firebase.
Câu hỏi thường gặp và cách khắc phục sự cố
Câu hỏi thường gặp
Khoá API cho dịch vụ Firebase có bị hạn chế theo mặc định không?
Có, theo mặc định, tất cả các khoá API mà Firebase tự động cấp phép để sử dụng với các API liên quan đến Firebase đều được "Hạn chế về API" tự động áp dụng. Xem danh sách API liên quan đến Firebase có trong danh sách cho phép này.
Các API được thêm vào danh sách cho phép này là những API do dịch vụ Firebase gọi từ mã ứng dụng khách và cần có khoá API để nhận dạng dự án hoặc ứng dụng Firebase của bạn. Xin lưu ý rằng hầu hết các API cần thiết để sử dụng dịch vụ Firebase thực sự không cần nằm trong danh sách cho phép cho các khoá API của bạn.
Vì Firebase thêm các API cần thiết cho tất cả dịch vụ Firebase, nên danh sách cho phép cho một khoá API có thể bao gồm các API cho những sản phẩm mà bạn không sử dụng. Bạn có thể xoá API khỏi danh sách cho phép, nhưng bạn phải cẩn thận để không xoá các API bắt buộc cho Firebase và dịch vụ Firebase mà bạn sử dụng (xem danh sách các API liên quan đến Firebase cần có trong danh sách cho phép của từng dịch vụ / sản phẩm). Nếu không, bạn sẽ gặp lỗi khi thực hiện lệnh gọi đến các dịch vụ Firebase.
Bạn có thể xem tất cả các khoá API và "giới hạn API" của các khoá đó trong bảng điều khiển API và dịch vụ > Thông tin xác thực trong bảng điều khiển Google Cloud.
Xin lưu ý những điều sau về cách Firebase áp dụng "các quy định hạn chế về API" này:
Trong tháng 5 năm 2024, tất cả các khoá API hiện có và không bị hạn chế mà Firebase đã tự động cấp phép trước đây sẽ bị hạn chế trong danh sách API liên quan đến Firebasecùng với mọi API hiện đang bật của dự án.
Mọi khoá API hiện có và đã bị hạn chế mà Firebase đã
tự động cấp phép trước đó sẽ không thay đổi.
Mọi khoá API hiện có không được Firebase tự động cấp phép sẽ không được thay đổi.
Làm cách nào để xác định khoá API
được liên kết với Ứng dụng Firebase của tôi?
Bạn có thể sử dụng bất kỳ lựa chọn nào sau đây để xác định khoá API nào được liên kết với Ứng dụng Firebase của mình:
bảng điều khiển của Firebase
Chuyển đến phần settingsCài đặt dự án, sau đó cuộn xuống thẻ Ứng dụng của bạn.
Chọn ứng dụng mà bạn quan tâm.
Lấy tệp/đối tượng cấu hình Firebase cho ứng dụng mà bạn quan tâm, sau đó tìm khoá API của ứng dụng đó:
Apple: Tải GoogleService-Info.plist xuống rồi tìm trường API_KEY
Android: Tải google-services.json xuống, tìm cấu hình của ứng dụng mà bạn quan tâm (tìm tên gói của ứng dụng đó), sau đó tìm trường current_key
Web: Chọn tuỳ chọn Config, sau đó tìm trường apiKey
Giao diện dòng lệnh (CLI) của Firebase
Lấy tệp/đối tượng cấu hình Firebase cho ứng dụng mà bạn quan tâm bằng cách chạy lệnh sau:
firebase apps:sdkconfig PLATFORMFIREBASE_APP_ID
PLATFORM (một trong): IOS | ANDROID | WEB
FIREBASE_APP_ID: giá trị nhận dạng duy nhất do Firebase chỉ định cho Ứng dụng Firebase của bạn (tìm Mã ứng dụng của bạn)
Trong cấu hình Firebase đã in của ứng dụng, hãy tìm khoá API của ứng dụng đó:
Táo: Tìm trường API_KEY
Android: Tìm cấu hình cho ứng dụng bạn quan tâm (tìm tên gói của ứng dụng đó), sau đó tìm trường current_key
Web: Tìm trường apiKey
API REST
Lấy apiKeyId (UID) của khoá API bằng cách gọi điểm cuối áp dụng cho ứng dụng mà bạn quan tâm, sau đó truyền giá trị apiKeyId sang bước tiếp theo.
keyString này là cùng một giá trị có thể tìm thấy trong cấu phần phần mềm cấu hình của Ứng dụng (Apple |
Android |
Web).
Tôi có thể liệt kê 2 khoá API cho cùng một ứng dụng Firebase trong tệp/đối tượng cấu hình Firebase không?
Ứng dụng Firebase Apple – Mỗi ứng dụng có tệp cấu hình riêng và chỉ được liệt kê một khoá API.
Ứng dụng Android trên Firebase – Tất cả ứng dụng Android trong dự án Firebase đều được liệt kê trong cùng một tệp cấu hình và mỗi ứng dụng chỉ có thể được liệt kê một khoá API. Tuy nhiên, mỗi ứng dụng trong tệp cấu hình này có thể được liệt kê một khoá riêng.
Ứng dụng web Firebase – Mỗi ứng dụng có đối tượng cấu hình riêng và chỉ được liệt kê một khoá API.
Tuy nhiên, bạn có thể sử dụng nhiều khoá API cho một ứng dụng. Bạn phải cung cấp cơ chế để ứng dụng truy cập vào các khoá API khác này, chẳng hạn như thông qua một biến môi trường. Cơ chế truy cập vào các khoá API khác không thể phụ thuộc vào các khoá API đó được liệt kê trong đối tượng/tệp cấu hình Firebase.
Làm cách nào để Firebase biết cần so khớp khoá API nào với một ứng dụng (chẳng hạn như trong tệp/đối tượng cấu hình Firebase)?
Nếu không tìm thấy khoá bị hạn chế nào khớp, Firebase sẽ liệt kê trong tệp cấu hình/đối tượng iOS key cho ứng dụng Apple, Android key cho ứng dụng Android và Browser key cho ứng dụng web (giả sử các khoá này tồn tại và không có "Hạn chế ứng dụng" ngăn chúng khớp với ứng dụng đó).
Tôi có thể xoá khoá và trường API khỏi đối tượng/tệp cấu hình Firebase theo cách thủ công không?
Có, bạn có thể xoá khoá API khỏi đối tượng/tệp cấu hình theo cách thủ công. Tuy nhiên, bạn phải cung cấp một số cơ chế khác để ứng dụng truy cập vào khoá API (chẳng hạn như thông qua biến môi trường). Nếu không, mọi lệnh gọi đến dịch vụ Firebase đều sẽ không thực hiện được.
Tôi có thể tự chỉnh sửa tệp/đối tượng cấu hình Firebase của mình bằng các khoá API khác nhau không?
Có, bạn có thể chỉnh sửa thủ công một tệp/đối tượng cấu hình để liên kết một khoá API khác với một ứng dụng.
Tôi có thể di chuyển khoá API từ dự án Firebase này sang dự án Firebase khác không?
Không, khoá API chỉ xác định một dự án cụ thể và không thể di chuyển sang một dự án khác.
Điều gì sẽ xảy ra nếu tôi xoá một khoá API trong bảng điều khiển Google Cloud?
Nếu bạn xoá khoá API mà một ứng dụng đang dùng, thì các lệnh gọi API từ ứng dụng đó sẽ không thực hiện được. Bạn có thể nhận được báo cáo, email hoặc lỗi mà bạn đang cố sử dụng một khoá API không hợp lệ.
Thao tác xoá khoá API có hiệu lực vĩnh viễn và không huỷ được sau khi thực hiện.
Các API nào bắt buộc phải có trong danh sách cho phép "Hạn chế API" cho khoá API Firebase?
Đối với khoá Firebase API, các API duy nhất cần có trong danh sách cho phép "Hạn chế API" của khoá là các API yêu cầu ứng dụng cung cấp khoá API kèm theo lệnh gọi. Xin lưu ý rằng rất ít API liên quan đến Firebase có yêu cầu này. Hầu hết các API liên quan đến Firebase được bật trong dự án của bạn không cần nằm trong danh sách cho phép "Hạn chế API" của khoá.
Sử dụng bảng sau đây để xác định những API liên quan đến Firebase cần được đưa vào danh sách cho phép "Hạn chế API" cho khoá API Firebase. Lưu ý rằng bạn chỉ nên sử dụng khoá API Firebase cho các dịch vụ Firebase. Tìm hiểu thêm về cách tạo các khoá API riêng biệt, bị hạn chế cho các loại API cụ thể.
Gửi thông báo qua đám mây, Crashlytics, Gửi thông báo trong ứng dụng, Giám sát hiệu suất, Cấu hình từ xa, Firebase ML
firebaseappcheck.googleapis.com
API Kiểm tra ứng dụng Firebase
Kiểm tra ứng dụng
firebaseappdistribution.googleapis.com
API Phân phối ứng dụng Firebase
Phân phối ứng dụng
firebaseapptesters.googleapis.com
API Người kiểm tra ứng dụng Firebase
Phân phối ứng dụng
identitytoolkit.googleapis.com
API Bộ công cụ nhận dạng
Xác thực
securetoken.googleapis.com
API Dịch vụ mã thông báo
Xác thực
firebaserules.googleapis.com *
API Quy tắc Firebase
Cloud Firestore, Cloud Storage, Cơ sở dữ liệu theo thời gian thực
datastore.googleapis.com
API Cloud Datastore
Cloud Firestore
firestore.googleapis.com
API Google Cloud Firestore
Cloud Firestore
fcmregistrations.googleapis.com
API đăng ký FCM
Gửi thông báo qua đám mây
firebasestorage.googleapis.com
API Cloud Storage cho Firebase
Cloud Storage
firebasedynamiclinks.googleapis.com
API Liên kết động của Firebase
Đường liên kết động
firebasehosting.googleapis.com *
API Lưu trữ Firebase
Lưu trữ
firebaseinappmessaging.googleapis.com
API Gửi thông báo trong ứng dụng của Firebase
Gửi thông báo trong ứng dụng
firebaseml.googleapis.com
API Firebase ML
Firebase ML, Vertex AI cho Firebase
mlkit.googleapis.com **
API Bộ công cụ học máy
Firebase ML
mobilecrashreporting.googleapis.com
Mobile Crash Reporting API
Giám sát hiệu suất
play.googleapis.com
Google Play Android Developer API
Giám sát hiệu suất
firebaseremoteconfig.googleapis.com
API Cấu hình từ xa Firebase
Giám sát hiệu suất, Cấu hình từ xa
firebaseremoteconfigrealtime.googleapis.com
API thời gian thực của Cấu hình từ xa Firebase
Giám sát hiệu suất, Cấu hình từ xa
Cloudconfig.googleapis.com **
Không áp dụng
Cấu hình từ xa
firebasedatabase.googleapis.com *
API Cơ sở dữ liệu theo thời gian thực Firebase
Cơ sở dữ liệu theo thời gian thực
* Chỉ bắt buộc nếu bạn đang sử dụng khoá API Firebase với các công cụ của bên thứ ba hoặc quyền truy cập REST trực tiếp vào dịch vụ / sản phẩm Firebase.
** Bắt buộc đối với các phiên bản trước đây của SDK sản phẩm. Nếu bạn đang sử dụng phiên bản SDK mới nhất, thì API không cần nằm trong danh sách cho phép của khoá.
Khắc phục sự cố
Làm thế nào để khắc phục lỗi API_KEY_SERVICE_BLOCKED hoặc lỗi Cấm 403 cho biết rằng các yêu cầu đến API này bị chặn?
Hãy làm theo hướng dẫn trong phần Câu hỏi thường gặp này nếu bạn gặp lỗi API_KEY_SERVICE_BLOCKED hoặc lỗi có dạng như sau:
Forbidden: 403 POST https://example-service.googleapis.com/method: Requests to this API example-service.googleapis.com method google.example-service.rest.method are blocked.
Khoá API mà ứng dụng của bạn dùng để gọi API có thể đã áp dụng "Hạn chế về API" và danh sách cho phép của khoá không bao gồm API đó.
Nếu gặp lỗi này khi cố gắng sử dụng dịch vụ không phải Firebase, bạn nên tạo khoá API mới dành riêng cho dịch vụ và API đó. Bạn chỉ nên sử dụng khoá API Firebase cho các dịch vụ / sản phẩm Firebase.
Tìm hiểu thêm về cách tạo các khoá API riêng biệt, bị hạn chế cho các loại API cụ thể.
Làm cách nào để khắc phục lỗi này? "Không tìm nạp được mã đo lường của ứng dụng Firebase này từ
máy chủ".
Khoá API mà ứng dụng web của bạn sử dụng có thể đã áp dụng "Hạn chế API". Trong trường hợp này, hãy đảm bảo API Quản lý Firebase nằm trong danh sách các API được phép.
Tôi nhận được email hoặc thông báo lỗi cho biết khoá API của tôi không hợp lệ. Điều gì đã xảy ra và làm cách nào để khắc phục vấn đề này?
Dưới đây là một số nguyên nhân phổ biến nhất khiến khoá API không hợp lệ:
Khoá API đã áp dụng "API Key quâns" (Hạn chế về khoá API) để khiến khoá này không so khớp được với ứng dụng cố gắng dùng khoá ("Application ngắn" (Hạn chế ứng dụng) hoặc không sử dụng được cho API đang được gọi ("API Hạn chế").
Khoá API đã bị xoá khỏi dự án trong bảng điều khiển Google Cloud.
Khoá API chưa được tạo cho Mã dự án được liệt kê trong đối tượng/tệp cấu hình Firebase của ứng dụng.
Một cách để khắc phục vấn đề này là lấy phiên bản cập nhật của tệp/đối tượng cấu hình Firebase của ứng dụng, sau đó thay thế tệp/đối tượng cấu hình cũ của bạn bằng tệp/đối tượng mới được cập nhật.
Trước khi gửi tệp cấu hình để tải xuống hoặc hiển thị một đối tượng cấu hình trong bảng điều khiển, Firebase sẽ kiểm tra để đảm bảo(các) khoá API được liệt kê khớp với(các) ứng dụng.