Play Integrity สำหรับ PC จะช่วยคุณตรวจสอบว่าเหตุการณ์ในเกมและคำขอของเซิร์ฟเวอร์มาจากอินสแตนซ์จริงของ Google Play Games สำหรับ PC ในอุปกรณ์ PC ของแท้ การตรวจจับอุปกรณ์ที่อาจมีความเสี่ยงและโปรแกรมจำลองที่ไม่รู้จักจะช่วยให้เซิร์ฟเวอร์แบ็กเอนด์ของเกมสามารถตอบสนองด้วยการดำเนินการที่เหมาะสมเพื่อป้องกันการโกง การเข้าถึงที่ไม่ได้รับอนุญาต การเข้าชมที่เป็นการฉ้อโกง และการละเมิด
สิ่งที่ต้องดำเนินการก่อน
- ตั้งค่า SDK ให้เสร็จสมบูรณ์
- อ่านข้อควรพิจารณาด้านความปลอดภัยของ Integrity API
- อ่านและทำความเข้าใจข้อกำหนดในการให้บริการของ Integrity API และ ข้อมูลการจัดการข้อมูล
- ใน Google Cloud Console ให้สร้างโปรเจ็กต์ Cloud หรือ เลือกโปรเจ็กต์ Cloud ที่มีอยู่ซึ่งคุณต้องการใช้กับ Play Integrity สำหรับ PC ไปที่ API และบริการ แล้ว เปิดใช้ Google Play Integrity API
- หากคาดว่าจะส่งคำขอ Play Integrity สำหรับ PC มากกว่า 10, 000 รายการต่อวัน คุณควรขอเพิ่มจำนวนสูงสุดต่อวัน
ขั้นตอนที่ 1: เลือกวิธีใช้ Play Integrity สำหรับ PC ในเกม
ตัดสินใจว่าจะเรียกใช้ Play Integrity สำหรับ PC เมื่อใดเพื่อรับผลการตัดสินความสมบูรณ์ เกี่ยวกับสภาพแวดล้อม เช่น คุณขอผลการตัดสินได้เมื่อเกม เปิดขึ้น เมื่อผู้เล่นลงชื่อเข้าใช้ หรือเมื่อผู้เล่นเข้าร่วมเกมแบบผู้เล่นหลายคน จากนั้น ตัดสินใจวิธีจัดการการตอบกลับความสมบูรณ์ที่แตกต่างกัน ดังตัวอย่างต่อไปนี้
- รวบรวมการตอบกลับโดยไม่มีการบังคับใช้ และวิเคราะห์ข้อมูลภายในเพื่อดูว่าการตอบกลับดังกล่าวเป็นสัญญาณการละเมิดที่มีประโยชน์หรือไม่
- รวบรวมการตอบกลับและใช้ตรรกะในเซิร์ฟเวอร์แบ็กเอนด์เพื่ออนุญาตให้ อุปกรณ์ที่ผ่านการตัดสินความสมบูรณ์เล่นเกมได้ตามปกติ ขณะเดียวกันก็ ท้าทายหรือปฏิเสธการเข้าถึงการเข้าชมที่มาจากสภาพแวดล้อมที่น่าสงสัย
- รวบรวมการตอบกลับและใช้ตรรกะในแบ็กเอนด์เพื่อจับคู่ผู้เล่นใน อุปกรณ์ที่ผ่านการตรวจสอบความสมบูรณ์เข้าด้วยกัน ขณะเดียวกันก็จับคู่การเข้าชมที่มาจาก สภาพแวดล้อมที่น่าสงสัยเข้าด้วยกัน
ขั้นตอนที่ 2: ขอโทเค็นความสมบูรณ์ในเกม
วอร์มอัป Play Integrity สำหรับ PC
เตรียม (หรือ "วอร์มอัพ") Play Integrity สำหรับ PC ซึ่งจะช่วยให้ Google Play แคชข้อมูลการรับรองบางส่วนอย่างชาญฉลาดในอุปกรณ์เพื่อ ลดเวลาในการตอบสนองในเส้นทางวิกฤตเมื่อคุณส่งคำขอ ผลการวินิจฉัยความสมบูรณ์ คุณสามารถทำแบบนี้แบบไม่พร้อมกันได้ทันทีที่เกมเปิดขึ้น เพื่อให้ส่งคำขอตรวจสอบความสมบูรณ์ตามต้องการได้เมื่อต้องการ
void PrepareIntegrityToken( const PrepareIntegrityTokenParams & params, PrepareIntegrityTokenContinuation continuation )
เมื่อสำเร็จ ระบบจะเรียกใช้ Continuation พร้อมกับ PrepareIntegrityTokenResultValue ที่มี RequestTokenData ซึ่งควรใช้เพื่อขอโทเค็นความสมบูรณ์ ควรแคชข้อมูลนี้ในหน่วยความจำและนำกลับมาใช้ใหม่ใน ระยะเวลาของเซสชันแอปพลิเคชันสำหรับการเรียกใช้ RequestIntegrityToken
ระบบจะเรียกใช้ PrepareIntegrityToken ก็ต่อเมื่อแอปพลิเคชันของคุณพิจารณาแล้วว่าจำเป็นต้องประเมินผลการตัดสินด้านความสมบูรณ์อีกครั้งทั้งหมด
รายละเอียด | |
---|---|
พารามิเตอร์ | params : พารามิเตอร์ที่มีหมายเลขโปรเจ็กต์ Google Cloud continuation : การเรียกกลับแบบไม่พร้อมกันเพื่อส่งคืนผู้ให้บริการโทเค็นความสมบูรณ์ |
ข้อมูลโค้ดที่แสดงวิธีเรียกใช้การดำเนินการ PrepareIntegrityToken มีดังนี้
google::play::integrity::IntegrityClient client_;
google::play::integrity::PrepareIntegrityTokenResult
IntegrityInterface::PrepareIntegrityToken(int64_t cloud_project_number) {
google::play::integrity::PrepareIntegrityTokenParams params;
params.cloud_project_number = cloud_project_number;
auto promise = std::make_shared<
std::promise<google::play::integrity::PrepareIntegrityTokenResult>>();
client_.PrepareIntegrityToken(
params,
[promise](
google::play::integrity::PrepareIntegrityTokenResult result) {
promise->set_value(std::move(result));
});
return promise->get_future().get();
}
ขอโทเค็นความสมบูรณ์
โทเค็นความสมบูรณ์เป็นกลไกที่เกมใช้เพื่อยืนยันว่าอุปกรณ์ไม่มีการ ดัดแปลง เมื่อใดก็ตามที่เกมของคุณส่งคำขอไปยังเซิร์ฟเวอร์ที่คุณต้องการตรวจสอบ ว่าถูกต้องหรือไม่ คุณสามารถขอโทเค็นความสมบูรณ์แล้วส่งไปยังเซิร์ฟเวอร์แบ็กเอนด์ของเกม เพื่อถอดรหัสและยืนยันได้
เมื่อตรวจสอบการดำเนินการของผู้ใช้ในแอปด้วย Play Integrity API สำหรับ PC คุณสามารถใช้ฟิลด์ RequestIntegrityTokenParams::request_hash เพื่อลดการโจมตีด้วยการดัดแปลงได้ เช่น คุณอาจต้องการรายงานคะแนนของผู้เล่นไปยังเซิร์ฟเวอร์แบ็กเอนด์ของเกม และเซิร์ฟเวอร์ของคุณต้องการยืนยันว่าคะแนนนี้ไม่ได้ถูกดัดแปลงโดยเซิร์ฟเวอร์พร็อกซี Play Integrity สำหรับ PC สามารถแสดงค่าที่คุณตั้งไว้ในช่องนี้ภายในคำตอบความสมบูรณ์ ที่ลงนามแล้ว หากไม่มี requestHash โทเค็นความสมบูรณ์จะเชื่อมโยงกับ อุปกรณ์เท่านั้น แต่จะไม่เชื่อมโยงกับคำขอที่เฉพาะเจาะจง ซึ่งจะเปิดโอกาสให้เกิด การโจมตี
void RequestIntegrityToken( const RequestIntegrityTokenParams & params, RequestIntegrityTokenContinuation continuation )
เมื่อขอผลการตัดสินความสมบูรณ์ ให้ทำดังนี้เพื่อลดโอกาสที่จะเกิดการโจมตี
- คำนวณข้อมูลสรุปของพารามิเตอร์คำขอที่เกี่ยวข้องทั้งหมด (เช่น SHA256 ของการซีเรียลไลซ์คำขอที่เสถียร) จากการกระทำของผู้ใช้หรือคำขอของเซิร์ฟเวอร์ที่เกิดขึ้น
- ตั้งค่าฟิลด์ RequestIntegrityTokenParams::request_hash เป็น ค่าแฮช
รายละเอียด | |
---|---|
พารามิเตอร์ | params : พารามิเตอร์ที่มี RequestTokenData ที่เตรียมไว้และแฮชคำขอตรวจสอบความสมบูรณ์ continuation : การเรียกกลับแบบไม่พร้อมกันเพื่อส่งคืนข้อมูล |
ข้อมูลโค้ดที่แสดงวิธีเรียกใช้การดำเนินการ RequestIntegrityToken มีดังนี้
absl::StatusOr<google::play::integrity::RequestIntegrityTokenResult>
IntegrityInterface::RequestIntegrityToken(
const google::play::integrity::PrepareIntegrityTokenResult&
prepare_integrity_token_result,
const std::string& request_hash) {
// Check if the prepare_integrity_token_result is OK
if (!prepare_integrity_token_result.ok()) {
return absl::FailedPreconditionError(
absl::StrCat("PrepareIntegrityTokenResult is not OK. Error code: ",
prepare_integrity_token_result.error_code));
}
google::play::integrity::RequestIntegrityTokenParams params{
.request_token_data =
prepare_integrity_token_result.request_token_data,
.request_hash = request_hash};
auto promise = std::make_shared<std::promise<
google::play::integrity::RequestIntegrityTokenResult>>();
client_.RequestIntegrityToken(
params,
[promise](google::play::integrity::RequestIntegrityTokenResult result) {
promise->set_value(std::move(result));
});
return promise->get_future().get();
}
ขั้นตอนที่ 3: ถอดรหัสและยืนยันโทเค็นความสมบูรณ์ในเซิร์ฟเวอร์แบ็กเอนด์ของเกมในขั้นตอนถัดไป
ถอดรหัสโทเค็นความสมบูรณ์
หลังจากที่คุณขอผลการตัดสินความสมบูรณ์แล้ว Play Integrity API จะให้โทเค็นการตอบกลับที่เข้ารหัส หากต้องการรับการตัดสินความสมบูรณ์ของอุปกรณ์ คุณต้อง ถอดรหัสโทเค็นความสมบูรณ์ในเซิร์ฟเวอร์ของ Google โดยทำดังนี้
- สร้างบัญชีบริการภายในโปรเจ็กต์ Google Cloud ที่ลิงก์กับแอป
ในเซิร์ฟเวอร์ของแอป ให้ดึงโทเค็นการเข้าถึงจากข้อมูลเข้าสู่ระบบบัญชีบริการ โดยใช้ขอบเขต playintegrity แล้วส่งคำขอต่อไปนี้
playintegrity.googleapis.com/v1/<var>PACKAGE_NAME</var>:decodePcIntegrityToken -d \ '{ "integrity_token": "<var>INTEGRITY_TOKEN</var>" }'
อ่านการตอบกลับ JSON
เพย์โหลดที่ได้คือโทเค็นข้อความธรรมดาที่มีผลการตัดสินความสมบูรณ์ และรายละเอียดพร้อมกับข้อมูลที่นักพัฒนาแอปให้ไว้ โทเค็นความสมบูรณ์ที่ถอดรหัสแล้ว จะมีลักษณะดังนี้
{
"requestDetails": {
"requestPackageName": "com.your.package.name",
"requestTime": "2025-08-29T13:10:37.285Z",
"requestHash": "your_request_hash_string"
},
"deviceIntegrity": {
"deviceRecognitionVerdict": [
"MEETS_PC_INTEGRITY"
]
},
}
ยืนยันโทเค็นความสมบูรณ์
ฟิลด์ requestDetails
ของโทเค็นความสมบูรณ์ที่ถอดรหัสแล้วมีข้อมูล
เกี่ยวกับคำขอ รวมถึงข้อมูลที่นักพัฒนาแอปให้ไว้ใน
requestHash
ฟิลด์ requestHash
และ packageName
ควรตรงกับฟิลด์ของคำขอเดิม
ดังนั้น ให้ยืนยันส่วน requestDetails
ของเพย์โหลด JSON โดย
ตรวจสอบว่า requestPackageName
และ requestHash
ตรงกับสิ่งที่ส่ง
ในคำขอเดิม ดังที่แสดงในข้อมูลโค้ดต่อไปนี้
const auto& request_details = json_payload["requestDetails"];
if (request_details.value("requestPackageName", "") != <YOUR_PACKAGE_NAME>) {
// Don't trust the verdicts.
}
// Check for the existence of the request_hash.
// If you set a request hash in the request and it's not present, you shouldn't
// trust the verdicts.
if (!request_details.contains("requestHash")) {
// Don't trust the verdicts.
}
// The requestHash from request_details needs to match the request hash your
// app provided.
if (request_details.value("requestHash", "") != <PROVIDED_REQUEST_HASH>) {
// Don't trust the verdicts.
}
// You can read the rest of payload's fields.
ขั้นตอนที่ 4: ตัดสินใจว่าจะดำเนินการใดตามผลการตัดสินความสมบูรณ์
ฟิลด์ deviceIntegrity
อาจมีค่าเดียว
deviceRecognitionVerdict
คุณใช้ค่านี้เพื่อพิจารณาว่าเกมกำลังทำงานบน PC ที่ผ่านการตรวจสอบความสมบูรณ์ของ Play (ซึ่งเป็นMEETS_PC_INTEGRITY
การตอบกลับ) หรือไม่ เซิร์ฟเวอร์แบ็กเอนด์ของเกมสามารถรวบรวมข้อมูลนี้
และใช้เพื่อพิจารณาว่าเกมควรดำเนินการใด เช่น
อนุญาตให้เหตุการณ์ในเกมดำเนินการต่อหรือปฏิเสธการเข้าถึงการเข้าชมที่มีความเสี่ยง
"deviceIntegrity": {
"deviceRecognitionVerdict": ["MEETS_PC_INTEGRITY"]
}
deviceRecognitionVerdict
อาจมีค่าดังต่อไปนี้
MEETS_PC_INTEGRITY
- เกมกำลังทำงานในสภาพแวดล้อม PC จริง ซึ่งไม่พบการดัดแปลงในอุปกรณ์
- ว่าง (ค่าว่าง)
- เกมกําลังทํางานในอุปกรณ์ที่มีสัญญาณการโจมตี (เช่น การฮุก API) หรือการบุกรุกระบบ (เช่น อุปกรณ์ที่ใช้ Google Desktop Services เวอร์ชันที่ดัดแปลง) หรือแอปไม่ทํางานในอุปกรณ์จริง (เช่น โปรแกรมจําลองที่ไม่ผ่านการตรวจสอบความน่าเชื่อถือของ Google Play)
ขั้นตอนที่ 5: จัดการรหัสข้อผิดพลาด
หากเกมของคุณส่งคำขอ Play Integrity สำหรับ PC และการเรียกใช้ล้มเหลว เกมจะ ได้รับรหัสข้อผิดพลาด ข้อผิดพลาดเหล่านี้อาจเกิดขึ้นได้จากหลายสาเหตุ เช่น ปัญหาด้านสภาพแวดล้อม เช่น การเชื่อมต่อเครือข่ายไม่ดี ปัญหาเกี่ยวกับการผสานรวม API หรือกิจกรรมที่เป็นอันตรายและการโจมตีที่ใช้งานอยู่
รหัสข้อผิดพลาดที่ลองอีกครั้งได้
สาเหตุของข้อผิดพลาดเหล่านี้บางครั้งเกิดจากสภาวะชั่วคราว ดังนั้นคุณ ควรลองเรียกอีกครั้งโดยใช้กลยุทธ์ Exponential Backoff
IntegrityError | คำอธิบายข้อผิดพลาด | รหัสข้อผิดพลาด |
---|---|---|
kNetworkError |
ปัญหาการเชื่อมต่อเครือข่ายในอุปกรณ์ | 5 |
kTooManyRequests |
มีการส่งคำขอจากอุปกรณ์มากเกินไป | 6 |
kClientTransientError |
ปัญหาชั่วคราวเกี่ยวกับไคลเอ็นต์ | 7 |
ดูคําแนะนําเพิ่มเติมเกี่ยวกับกลยุทธ์การลองใหม่ได้ที่นี่
รหัสข้อผิดพลาดที่ลองอีกครั้งไม่ได้
การลองใหม่โดยอัตโนมัติไม่น่าจะช่วยได้ในกรณีเหล่านี้ อย่างไรก็ตาม การลองอีกครั้งด้วยตนเอง อาจช่วยได้หากผู้ใช้แก้ไขเงื่อนไขที่ทำให้เกิดปัญหา
IntegrityError | คำอธิบายข้อผิดพลาด | รหัสข้อผิดพลาด | การดำเนินการที่แนะนำ |
---|---|---|---|
kError |
เกิดข้อผิดพลาดร้ายแรงระหว่างการดำเนินการ SDK | 1 | ยืนยันการติดตั้งใช้งาน API ก่อนลองอีกครั้ง |
kCloudProjectNumberIsInvalid |
หมายเลขโปรเจ็กต์ที่อยู่ในระบบคลาวด์ไม่ถูกต้อง | 2 | ตรวจสอบว่าได้กำหนดค่าหมายเลขโปรเจ็กต์ระบบคลาวด์ใน Google Cloud Console อย่างถูกต้อง และส่งคำขอด้วยหมายเลขโปรเจ็กต์ระบบคลาวด์ที่ถูกต้อง |
kRequestHashTooLong |
แฮชคำขอยาวเกินไป | 3 | แฮชคำขอที่สร้างยาวเกินไป โปรดตรวจสอบว่ามีความยาวน้อยกว่า 500 อักขระ |
kNoValidPreparedTokenFound |
ไม่มีโทเค็นที่เตรียมไว้ก่อนส่งคำขอโทเค็น | 4 | เรียกใช้การดำเนินการ [PrepareIntegrityToken][prepare-token] ก่อนที่จะทำการเรียก [RequestIntegrityToken][request-integrity-token] |
kSdkRuntimeUpdateRequired |
ต้องอัปเดต Play for Native SDK | 8 | ตรวจสอบว่าไคลเอ็นต์บริการ Google Play ในอุปกรณ์เป็นเวอร์ชันล่าสุด และคุณกำลังใช้ Play สำหรับ Native PC SDK เวอร์ชันล่าสุด |