2013-01-07 39 views
7

"Clash of Clans" sử dụng Trung tâm trò chơi để xác thực và liên kết người chơi với trạng thái trò chơi được lưu trữ từ xa hiện tại.Xác thực trình phát của Trung tâm trò chơi trên máy chủ trò chơi trực tuyến

Từ những gì tôi có thể thấy, trò chơi chỉ được cung cấp mã nhận dạng người chơi ở phía máy khách. Có một kỹ thuật được hỗ trợ để xác thực một cách an toàn một người dùng thay vì gửi chỉ định danh (mà là tương đương với việc xác thực chỉ với một tên người dùng)?

+1

Câu hỏi này có câu trả lời: http://stackoverflow.com/questions/15755489/setting-up-third-party-server-to-interact-with-game-center –

Trả lời

0

Vì bạn đang xác thực với máy chủ của riêng mình, đây là thứ giữa khách hàng và máy chủ của bạn để triển khai. Trung tâm trò chơi sẽ không thể giúp bạn.

Một ý tưởng đơn giản là tính giá trị băm từ playerID bằng cách sử dụng chức năng mà chỉ bạn biết và có máy chủ so sánh nó với những gì khách hàng đang gửi.

Tránh tạo khóa ngẫu nhiên khi khách hàng của bạn chạy lần đầu tiên, vì khi khách hàng được cài đặt lại, người dùng sẽ bị khóa.

+0

Thật vậy, đó là một cách để .. làm chậm người xuống. Một thiết bị bẻ khóa có thể dễ dàng bị lừa để trả về một playerID khác - đó chính là lý do tại sao tôi yêu cầu điều gì đó an toàn hơn. Và xem xét các trò chơi như Clash of Clans chứa IAP liên quan đến Game Center-tài khoản, thậm chí có tiền có nguy cơ - và mối quan tâm này là lý do tại sao tôi hỏi. Âm thanh như kiểm tra auth phía máy chủ là một ứng cử viên tốt cho một radar: - / –

1

Vì tôi đã đặt câu hỏi, Apple đã giới thiệu một API mới và câu trả lời có sẵn trên: Setting up third-party server to interact with Game Center (cảm ơn bạn, user2949759) và trên một vài địa điểm khác.

Specifically, vì iOS 7 (Apple documentation on Wayback Machine):

-[GKLocalPlayer generateIdentityVerificationSignatureWithCompletionHandler:]

Tạo một chữ ký cho phép một máy chủ của bên thứ ba để xác thực các cầu thủ địa phương.

luận Các callback khối có liên quan bao gồm NSURL *publicKeyUrl, NSData *signature, NSData *salt, uint64_t timestamp. Những điều này, cùng với playerIDbundleID của người chơi, phải được chuyển tới máy chủ dưới dạng 'thông tin đăng nhập'.

  • Tại thời điểm này, ta nên, serverside, sử dụng publicKeyURL để có được công chúng quan trọng
  • serverside, xác minh rằng khóa công khai này đã được ký kết bởi Apple
  • serverside, concatenate UTF-8-mã hóa playerID, bundleID, lớn-endian uint64 dấu thời gian, và đúng nguyên văn salt
  • serverside, tạo SHA-256 của các bên trên để sản xuất digest
  • serverside, xác minh signature đã được vận chuyển đến máy chủ là đúng, using khóa công khai đã tải về trước đó, signaturedigest

Có một example in pseudo-PHP, một example of how one would implement this in Objective-C (mà làm cho chút ý thức sử dụng đúng nguyên văn), một Go implementation, một Ruby implementation và có một loại triển khai bằng các ngôn ngữ khác trên cùng một câu hỏi đó.

Không có gì ngạc nhiên khi việc triển khai trong Go dường như có thể đọc được, nhưng nó không xác minh rằng khóa công khai được phát hành bởi Apple. Việc triển khai Ruby được liên kết có chứa một ví dụ khá rõ ràng về cách thực hiện điều đó.

Các vấn đề liên quan