Thêm quy trình xác minh giấy phép phía máy chủ vào ứng dụng
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.
Khi xác minh rằng người dùng đã mua hoặc tải bản sao hợp lệ của
ứng dụng xuống từ Cửa hàng Google Play, tốt nhất là bạn nên kiểm tra giấy phép
trên một máy chủ mà bạn kiểm soát.
Hướng dẫn này trình bày quy trình từng bước để hoàn tất quá trình xác minh giấy phép phía máy chủ và trình bày các phương pháp hay nhất có liên quan đến việc thực hiện quy trình kiểm tra này.
Tổng quan về quy trình
Hình 1 cho thấy cách chuyển thông tin giữa ứng dụng, Google Play và
máy chủ riêng tư:
Hình 1. Luồng dữ liệu giữa ứng dụng và Google Play, sau đó
giữa ứng dụng và máy chủ riêng
Ứng dụng gửi yêu cầu đến Google Play, điều tra xem một người dùng cụ thể đã mua hoặc tải bản sao hợp lệ của ứng dụng xuống hay không.
Google Play phản hồi bằng cách gửi một đối tượng dữ liệu phản hồi, một đối tượng thuộc loại
ResponseData tới ứng dụng. Đối tượng này là một phần thông tin đã ký, cho biết rõ liệu
người dùng đã mua hoặc tải bản sao hợp lệ của ứng dụng xuống.
Ứng dụng gửi yêu cầu đến máy chủ riêng mà bạn kiểm soát, xác minh nội dung của dữ liệu phản hồi.
Máy chủ sẽ phản hồi bằng cách gửi một trạng thái tới ứng dụng, cho biết liệu người dùng
đã thực sự mua hoặc tải bản sao hợp lệ của ứng dụng xuống hay chưa. Nếu
máy chủ cung cấp một thông báo "thành công", hãy xác minh phản hồi rồi cấp quyền truy cập cho người dùng vào các tài nguyên cần có giấy phép.
Dữ liệu phản hồi được Google Play ký, sau đó được kiểm tra trên máy chủ, bởi vậy nên không có cách nào để sửa đổi đối tượng trên thiết bị đang chạy ứng dụng. Nếu
ứng dụng dựa vào máy chủ và chỉ cung cấp tài nguyên cho người dùng
hợp lệ thì ứng dụng sẽ được bảo vệ tốt hơn nhiều trước người dùng trái phép.
Các mục sau đây cung cấp thêm những điểm cần lưu ý khi
thực hiện quy trình xác minh giấy phép phía máy chủ.
Biện pháp bảo vệ khỏi các cuộc tấn công phát lại
Sau khi nhận được phản hồi từ Google Play về trạng thái giấy phép của người dùng,
người dùng có thể sao chép dữ liệu phản hồi và sử dụng chúng nhiều lần,
hoặc cung cấp dữ liệu này cho những người dùng khác để họ giả mạo yêu cầu tới máy chủ riêng của ứng dụng. Loại hành động này được gọi là tấn công phát lại.
Để giảm khả năng người dùng thực hiện thành công các cuộc tấn công phát lại, hãy thực hiện
các biện pháp sau trước khi gửi yêu cầu đến máy chủ ứng dụng:
Kiểm tra dấu thời gian trong dữ liệu phản hồi để đảm bảo rằng Google Play đã tạo phản hồi gần đây.
Hãy hạn chế số lượng gửi/nhận yêu cầu lên máy chủ, chẳng hạn như thời gian đợi luỹ thừa để giảm số lần ứng dụng cố gắng gửi cùng một dữ liệu phản hồi đến máy chủ của ứng dụng.
Trước khi xác minh nội dung dữ liệu phản hồi của Google Play trên máy chủ riêng, hãy tạo một yêu cầu ban đầu, dựa trên cơ chế xác thực tới máy chủ riêng. Trong yêu cầu đầu tiên này, hãy gửi thông tin đăng nhập của người dùng đến máy chủ và yêu cầu máy chủ đó
phản hồi bằng số chỉ dùng một lần hoặc một số chỉ được dùng một lần. Sau đó, bạn có thể
đưa số chỉ dùng một lần này vào yêu cầu tiếp theo tới máy chủ riêng để yêu cầu
dữ liệu xác minh giấy phép. Để biết chi tiết về cách chọn giá trị phù hợp cho số chỉ dùng một lần, hãy xem mục tạo giá trị số chỉ dùng một lần thích hợp.
Tạo giá trị số chỉ dùng một lần thích hợp
Sử dụng một trong các kỹ thuật sau để tạo giá trị số chỉ dùng một lần khó đoán:
Tạo giá trị băm dựa trên mã nhận dạng của người dùng đó.
Tạo một giá trị ngẫu nhiên cho mỗi người dùng. Lưu trữ giá trị ngẫu nhiên này trên máy chủ
của ứng dụng như một phần trong thuộc tính của người dùng nhất định.
Xác minh dữ liệu phản hồi từ máy chủ
Khi xem lại dữ liệu phản hồi mà máy chủ ứng dụng gửi đến ứng dụng, hãy đảm bảo rằng phản hồi Thư viện xác minh giấy phép không bị giả mạo. Xác minh chữ ký có trong dữ liệu phản hồi của máy chủ ứng dụng bằng cách so sánh với khoá mà ứng dụng của bạn nhận được từ Google Play ở bước trước đó.
Bạn cũng nên nhớ rằng khối cụ thể dành cho Thư viện xác minh giấy phép (LVL) là phần duy nhất được ký. Do đó, đó là phần duy nhất trong dữ liệu phản hồi của máy chủ ứng dụng mà ứng dụng nên tin tưởng.
Nội dung và mã mẫu trên trang này phải tuân thủ các giấy phép như mô tả trong phần Giấy phép nội dung. Java và OpenJDK là nhãn hiệu hoặc nhãn hiệu đã đăng ký của Oracle và/hoặc đơn vị liên kết của Oracle.
Cập nhật lần gần đây nhất: 2025-07-27 UTC.
[[["Dễ hiểu","easyToUnderstand","thumb-up"],["Giúp tôi giải quyết được vấn đề","solvedMyProblem","thumb-up"],["Khác","otherUp","thumb-up"]],[["Thiếu thông tin tôi cần","missingTheInformationINeed","thumb-down"],["Quá phức tạp/quá nhiều bước","tooComplicatedTooManySteps","thumb-down"],["Đã lỗi thời","outOfDate","thumb-down"],["Vấn đề về bản dịch","translationIssue","thumb-down"],["Vấn đề về mẫu/mã","samplesCodeIssue","thumb-down"],["Khác","otherDown","thumb-down"]],["Cập nhật lần gần đây nhất: 2025-07-27 UTC."],[],[],null,["# Adding Server-Side License Verification to Your App\n\nWhen verifying that the user has purchased or downloaded a legitimate copy of\nyour app from the Google Play Store, it's best to perform the license\nverification check on a server that you control.\n\nThis guide presents a step-by-step process for completing server-side license\nverification and presents some best practices related to performing this check.\n\nProcess overview\n----------------\n\nFigure 1 shows how information is transferred between your app, Google Play, and\nyour private server: \n**Figure 1.** Flow of data between your app and Google Play, then between your app and your private server\n\n1. Your app makes a request to Google Play, inquiring about whether a particular user has purchased or downloaded a legitimate copy of your app.\n2. Google Play responds by sending a *response data object* , an object of type [`ResponseData`](/google/play/licensing/licensing-reference#lvl-summary), to your app. This object is a signed piece of information that states whether the user has purchased or downloaded a legitimate copy of your app.\n3. Your app makes a request to a private server that you control, verifying the contents of the response data.\n4. The server responds by sending a status to your app, indicating whether the user has indeed purchased or downloaded a legitimate copy of your app. If the server provides a \"success\" message, [verify the\n response](#verify-app-server-response) and then grant the user access to the resources that require a license.\n\nBecause the response data is signed by Google Play, then checked on your\nserver, there's no way to modify the object on the device running your app. If\nyour app relies on the server and makes resources available only to legitimate\nusers, your app is substantially more protected against unauthorized users.\n\nThe following sections provide additional considerations to keep in mind when\nperforming server-side license verification.\n\nSafeguard against replay attacks\n--------------------------------\n\nAfter receiving a response from Google Play regarding the user's license status,\nit's possible for the user to copy the response data and use it multiple times,\nor give it to other users who could then forge their own requests to your app's\nprivate server. This sort of action is known as a *replay attack*.\n\nTo reduce the likelihood of users performing replay attacks successfully, take\nthe following measures before sending a request to your app's server:\n\n- Check the timestamp that's included in the response data, making sure that\n Google Play generated the response recently.\n\n | **Note:** You can increase the allowed difference between the response data's timestamp and the current time based on how long users should be able to interact with license-bound resources after they deactivate their license.\n- Perform rate-limiting on your server request, such as exponential backoff, to\n reduce the number of times that your app attempts to send the same response data\n to your app's server.\n\n | **Caution:** To preserve a good user experience in cases where a user interacts with your app on a variety of devices, be careful if you add rate-limiting based on number of devices.\n- Before verifying the contents of Google Play's response data on your private\n server, make an initial, authentication-based request to your private server. In\n this first request, send user credentials to your server, and have your server\n then respond with a *nonce* , or a number that is used only once. You can then\n include this nonce in your next request to your private server, asking for\n license verification data. For details on how to choose a good value for the\n nonce, see the [generate a suitable nonce value](#generate-nonce) section.\n\n | **Note:** Include a user ID field in both the nonce request and the license verification request. Your app's server can then compare the fields' values from the two requests and make sure they match.\n\n### Generate a suitable nonce value\n\nUse one of the following techniques to create a nonce value that's difficult to\nguess:\n\n- Generate a hash value based on the user's ID.\n- Generate a random value on a per-user basis. Store this random value on your app's server as part of a given user's attributes.\n\nVerify response data from your server\n-------------------------------------\n\nWhen reviewing response data that your app's server sends to your app, make sure\nthat the License Verification Library response isn't forged. Verify the\nsignature that's included in the app server's response data by comparing it\nwith the key that your app received from Google Play in a previous step.\n\nIt's also worth remembering that the block specific to the License Verification\nLibrary (LVL) is the only part that's signed. Therefore, it's the only part of\nyour app server's response data that your app should trust."]]