Cho phép máy chủ truy cập vào Dịch vụ trò chơi của Google Play

Nếu trò chơi của bạn sử dụng máy chủ phụ trợ, bạn nên dùng Đăng nhập bằng Google để xác thực người chơi và truyền danh tính của người chơi đến máy chủ phụ trợ một cách an toàn. Thao tác này cũng cho phép để truy xuất an toàn danh tính và các dữ liệu khác của người chơi mà không có nguy cơ bị can thiệp khi đi qua thiết bị.

Trong trường hợp này, trò chơi của bạn sẽ nhắc người chơi đăng nhập vào các dịch vụ trò chơi của Google Play như bình thường. Khi người chơi đăng nhập thành công, đối tượng GoogleSignInAccount chứa một mã dùng một lần đặc biệt (gọi là mã xác thực máy chủ) mà ứng dụng truyền đến máy chủ. Sau đó, trên máy chủ, trao đổi mã xác thực máy chủ cho mã thông báo OAuth 2.0 mà máy chủ có thể sử dụng để thực hiện lệnh gọi đến API Dịch vụ trò chơi của Google Play.

Để được hướng dẫn thêm về cách thêm tính năng đăng nhập vào trò chơi, hãy xem Đăng nhập vào trò chơi trên Android.

Để xem mã mẫu chi tiết minh hoạ cách sử dụng tính năng Đăng nhập bằng Google để xác thực người chơi, hãy xem Mẫu clientserverskeleton trên GitHub.

Bạn cần thực hiện các bước sau đây để truy cập ngoại tuyến:

  1. Trong Google Play Console: hãy tạo thông tin xác thực cho máy chủ trò chơi của bạn. Chiến lược phát hành đĩa đơn Loại ứng dụng OAuth của thông tin đăng nhập sẽ là "web".
  2. Trên ứng dụng Android: trong quá trình đăng nhập, hãy yêu cầu mã xác thực máy chủ để xác thực thông tin đăng nhập của máy chủ, và truyền mã đó đến máy chủ của bạn.
  3. Trên máy chủ trò chơi: Trao đổi mã xác thực máy chủ để có quyền truy cập vào OAuth mã thông báo bằng cách sử dụng dịch vụ xác thực của Google, rồi sử dụng mã này để gọi hàm API REST trong Dịch vụ trò chơi của Play.

Trước khi bắt đầu

Trước khi có thể tích hợp tính năng Đăng nhập bằng Google vào trò chơi, trước tiên bạn cần thêm trò chơi vào Google Play Console, theo mô tả trong Thiết lập Dịch vụ trò chơi của Google Play.

Tạo một ứng dụng web phía máy chủ liên kết cho trò chơi của bạn

Dịch vụ trò chơi của Google Play không cung cấp chương trình hỗ trợ cho Trò chơi trên web. Tuy nhiên, hệ thống này có dịch vụ máy chủ phụ trợ cho máy chủ trò chơi Android của bạn.

Nếu bạn muốn sử dụng API REST cho Dịch vụ trò chơi của Google Play trong ứng dụng phía máy chủ, hãy làm theo các bước sau:

  1. Tạo ứng dụng web được liên kết cho trò chơi của bạn trong phần Ứng dụng được liên kết của Google Play Console. Lưu ý rằng launch_url không được dùng cho quy trình này và có thể để trống.
  2. Để lấy thông tin đăng nhập cho ứng dụng của bạn, hãy làm theo các bước sau:
    1. Trong trò chơi của bạn trên Google Play Console, hãy nhấp vào Chi tiết trò chơi.
    2. Di chuyển xuống phần Dự án trên bảng điều khiển API rồi nhấp vào đường liên kết đối với dự án trên bảng điều khiển API.
    3. Từ API và Dịch vụ > Màn hình Thông tin xác thực trong API Google Console, hãy tải tệp client_secret.json xuống cho ứng dụng web của bạn và lưu nó vào vị trí mà máy chủ của bạn có thể truy cập. Ghi máy khách Mã của thông tin đăng nhập để tham khảo sau này.
  3. Khởi động lại ứng dụng phía máy chủ để ứng dụng sẵn sàng chấp nhận yêu cầu từ ứng dụng khách của Google Play.

Thực hiện đăng nhập trên máy khách

Lớp GoogleSignInClient là điểm truy cập chính để truy xuất tài khoản của trình phát đã đăng nhập và đăng nhập trình phát nếu trước đây họ chưa thực hiện thao tác như vậy trên ứng dụng của bạn trong thiết bị.

Để tạo một ứng dụng đăng nhập, hãy làm theo các bước sau:

  1. Tạo một ứng dụng đăng nhập thông qua đối tượng GoogleSignInOptions. Trong GoogleSignInOptions.Builder để định cấu hình quy trình đăng nhập, bạn phải chỉ định GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN.
  2. Bạn cũng phải chỉ định rằng trò chơi của bạn yêu cầu quyền xác thực mã cho máy chủ phụ trợ của mình bằng cách gọi hàm Phương thức GoogleSignInOptions.Builder.requestServerAuthCode() có mã ứng dụng khách của máy chủ là . Sau đó, bạn sẽ truy xuất mã xác thực để dùng mã truy cập trên máy chủ phụ trợ theo cách mô tả trong phần Lấy mã uỷ quyền máy chủ.
  3. Gọi phương thức GoogleSignIn.getClient() và chuyển vào các tuỳ chọn mà bạn đã định cấu hình trước đó. Nếu cuộc gọi thành công, API Đăng nhập bằng Google sẽ trả về một bản sao của GoogleSignInClient.
  4. Sau khi có được thực thể GoogleSignInClient, bạn cần tiến hành đăng nhập người chơi im lặng từ onResume() của hoạt động, như được mô tả trong Đăng nhập trong chế độ im lặng.

Ví dụ:

private static final int RC_SIGN_IN = 9001;
private GoogleSignInClient mGoogleSignInClient;

private void startSignInForAuthCode() {

  // Client ID for your backend server.
  String webClientId = getString(R.string.webclient_id);

  GoogleSignInOptions signInOption = new
      GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN)
      .requestServerAuthCode(webClientId)
      .build();

  GoogleSignInClient signInClient = GoogleSignIn.getClient(this, signInOption);
  Intent intent = signInClient.getSignInIntent();
  startActivityForResult(intent, RC_SIGN_IN);
}

Lấy mã xác thực máy chủ

Cách truy xuất mã xác thực máy chủ mà trò chơi của bạn có thể dùng cho mã truy cập trên máy chủ phụ trợ: gọi getServerAuthCode() trên GoogleSignInAccount mà tính năng Đăng nhập bằng Google trả về khi người chơi đăng nhập thành công.

Ví dụ:


// Auth code to send to backend server.
private String mServerAuthCode;

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  super.onActivityResult(requestCode, resultCode, data);
  if (requestCode == RC_SIGN_IN) {
    GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
    if (result.isSuccess()) {
      mServerAuthCode = result.getSignInAccount().getServerAuthCode();
    } else {
      String message = result.getStatus().getStatusMessage();
      if (message == null || message.isEmpty()) {
        message = getString(R.string.signin_other_error);
      }
      new AlertDialog.Builder(this).setMessage(message)
          .setNeutralButton(android.R.string.ok, null).show();
    }
  }
}

Trao đổi mã xác thực máy chủ để lấy mã truy cập trên máy chủ

Gửi mã xác thực máy chủ đến máy chủ phụ trợ của bạn để trao đổi quyền truy cập và làm mới mã thông báo. Sử dụng mã truy cập để gọi API Dịch vụ trò chơi của Google Play thay mặt cho người chơi và (không bắt buộc) lưu trữ mã làm mới để lấy mã truy cập mới khi mã truy cập hết hạn.

Đoạn mã sau đây cho thấy cách bạn có thể triển khai mã phía máy chủ trong Java ngôn ngữ lập trình để trao đổi mã xác thực máy chủ lấy mã truy cập. Đó là sử dụng ứng dụng mẫu clientserverskeleton:

/**
 * Exchanges the authcode for an access token credential.  The credential
 * is the associated with the given player.
 *
 * @param authCode - the non-null authcode passed from the client.
 * @param player   - the player object which the given authcode is
 *                 associated with.
 * @return the HTTP response code indicating the outcome of the exchange.
 */
private int exchangeAuthCode(String authCode, Player player) {
try {

    // The client_secret.json file is downloaded from the Google API
    // console.  This is used to identify your web application.  The
    // contents of this file should not be shared.
    //
    File secretFile = new File("client_secret.json");

    // If we don't have the file, we can't access any APIs, so return
    // an error.
    if (!secretFile.exists()) {
        log("Secret file : " + secretFile
                .getAbsolutePath() + "  does not exist!");
        return HttpServletResponse.SC_FORBIDDEN;
    }

    GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(
            JacksonFactory.getDefaultInstance(), new
            FileReader(secretFile));

    // Extract the application id of the game from the client id.
    String applicationId = extractApplicationId(clientSecrets
            .getDetails().getClientId());

    GoogleTokenResponse tokenResponse =
            new GoogleAuthorizationCodeTokenRequest(
            HTTPTransport,
            JacksonFactory.getDefaultInstance(),
            "https://oauth2.googleapis.com/token",
            clientSecrets.getDetails().getClientId(),
            clientSecrets.getDetails().getClientSecret(),
            authCode,
            "")
            .execute();

    log("hasRefresh == " + (tokenResponse.getRefreshToken() != null));
    log("Exchanging authCode: " + authCode + " for token");
    Credential credential = new Credential
            .Builder(BearerToken.authorizationHeaderAccessMethod())
            .setJsonFactory(JacksonFactory.getDefaultInstance())
            .setTransport(HTTPTransport)
            .setTokenServerEncodedUrl("https://www.googleapis.com/oauth2/v4/token")
            .setClientAuthentication(new HttpExecuteInterceptor() {
                @Override
                public void intercept(HttpRequest request)
                        throws IOException {
                        }
            })
            .build()
            .setFromTokenResponse(tokenResponse);

    player.setCredential(credential);

    // Now that we have a credential, we can access the Games API.
    PlayGamesAPI api = new PlayGamesAPI(player, applicationId,
            HTTPTransport, JacksonFactory.getDefaultInstance());

    // Call the verify method, which checks that the access token has
    // access to the Games API, and that the player id used by the
    // client matches the playerId associated with the accessToken.
    boolean ok = api.verifyPlayer();

    // Call a Games API on the server.
    if (ok) {
        ok = api.updatePlayerInfo();
        if (ok) {
            // persist the player.
            savePlayer(api.getPlayer());
        }
    }

    return ok ? HttpServletResponse.SC_OK :
            HttpServletResponse.SC_INTERNAL_SERVER_ERROR;

  } catch (IOException e) {
    e.printStackTrace();
  }
  return HttpServletResponse.SC_INTERNAL_SERVER_ERROR;
}

Để tìm hiểu thêm về cách truy cập API của Google từ máy chủ phụ trợ thay mặt cho người chơi đã đăng nhập, hãy xem Bật quyền truy cập phía máy chủ.

Xử lý hoạt động đăng xuất người chơi

Để đăng xuất người chơi khỏi trò chơi của bạn, hãy gọi phương thức signOut() trên GoogleSignInClient. Đối với đoạn mã ví dụ, xem Đăng xuất người chơi.

Thực hiện lệnh gọi API REST từ máy chủ

Tham khảo API REST cho Dịch vụ trò chơi của Google Play để nội dung mô tả đầy đủ về các lệnh gọi API có sẵn.

Dưới đây là ví dụ về các lệnh gọi API REST mà bạn có thể thấy hữu ích:

Người chơi

  • Bạn muốn lấy dữ liệu hồ sơ và mã nhận dạng của người chơi đã đăng nhập? Gọi Players.get trong đó mã nhận dạng là 'me'.

Bạn bè

Hãy nhớ xem lại hướng dẫn về Bạn bè, phần giải thích chi tiết hơn về bạn bè.

  • Bạn muốn truy xuất danh sách bạn bè của người chơi? Gọi Players.list bằng 'friends_all' trong vai trò collection.
  • Kiểm tra xem bạn có quyền truy cập vào danh sách bạn bè không? Gọi Players.get cho me và hãy xem trường profileSettings.friendsListVisibility trong phản hồi.

Thành tích

Hãy nhớ xem lại hướng dẫn Thành tích, trong đó giải thích về thành tích chi tiết hơn.

  • Bạn muốn nhận danh sách các thành tích hiện tại? Bạn có thể thực hiện lệnh gọi đến AchievementDefinitions.list.
  • Hãy kết hợp dữ liệu đó với một lệnh gọi đến Achievements.list để tìm ra người chơi đã mở khóa được những thành tích nào.
  • Người chơi có đạt được thành tích không? Hãy sử dụng Achievements.unlock để mở khóa!
  • Người chơi có tiến bộ để đạt được một phần thành tích không? Sử dụng Achievements.increment để báo cáo tiến trình (và tìm hiểu xem người chơi có mở khoá được tiến trình đó hay không).
  • Có phải bạn đang gỡ lỗi cho một trò chơi chưa phát hành công khai không? Thử gọi Achievements.reset hoặc Achievements.resetAll trong API Quản lý để đặt lại thành tích về trạng thái ban đầu.

Bảng xếp hạng

Đừng quên xem xét hướng dẫn về Bảng xếp hạng, phần này giải thích chi tiết hơn về bảng xếp hạng.

  • Bạn muốn nhận danh sách tất cả các bảng điểm trong trò chơi? Hãy gọi đến Leaderboards.list
  • Người chơi đã hoàn tất một trò chơi chưa? Bạn có thể gửi điểm số của họ đến trang Scores.submit và tìm hiểu xem đây là điểm cao mới.
  • Bạn muốn hiển thị một bảng xếp hạng? Lấy dữ liệu từ Scores.list và hiển thị dữ liệu đó cho người dùng.
  • Sử dụng Scores.listWindow để tìm một loạt các điểm số gần với điểm cao của người dùng.
  • Để biết thêm thông tin về điểm số của người chơi trong một bảng xếp hạng cụ thể (ví dụ: nếu người chơi nằm trong nhóm 12% người chơi hàng đầu), hãy gọi Scores.get.
  • Bạn đang gỡ lỗi cho một trò chơi? Hãy thử gọi Scores.reset từ trang Quản lý API để đặt lại tất cả điểm số của người chơi đó trong một bảng xếp hạng cụ thể