การเปิดใช้การเข้าถึงบริการเกมของ Google Play ในฝั่งเซิร์ฟเวอร์

หากเกมของคุณใช้เซิร์ฟเวอร์แบ็กเอนด์ เราขอแนะนำให้คุณใช้ Google Sign-In เพื่อตรวจสอบสิทธิ์โปรแกรมเล่นและ ส่งข้อมูลประจำตัวของโปรแกรมเล่นไปยังเซิร์ฟเวอร์แบ็กเอนด์อย่างปลอดภัย การทำเช่นนี้ยังทำให้ เกมของคุณเพื่อดึงข้อมูลตัวตนและข้อมูลอื่นๆ ของผู้เล่น และมีโอกาสถูกงัดแงะขณะผ่านอุปกรณ์

ในสถานการณ์นี้ เกมจะแจ้งให้ผู้เล่นลงชื่อเข้าใช้บริการเกมของ Google Play ตามปกติ เมื่อ โปรแกรมเล่นลงชื่อเข้าใช้สำเร็จ ออบเจ็กต์ GoogleSignInAccount มีรหัสพิเศษแบบใช้ครั้งเดียว (เรียกว่ารหัสการตรวจสอบสิทธิ์ของเซิร์ฟเวอร์) ที่ไคลเอ็นต์ส่งผ่านไปยังเซิร์ฟเวอร์ จากนั้น Exchange บนเซิร์ฟเวอร์ รหัสการตรวจสอบสิทธิ์เซิร์ฟเวอร์สำหรับโทเค็น OAuth 2.0 ที่เซิร์ฟเวอร์สามารถใช้ในการเรียกไปยัง API บริการเกมของ Google Play

ดูคำแนะนำเพิ่มเติมเกี่ยวกับการเพิ่มการลงชื่อเข้าใช้ในเกมได้ที่ ลงชื่อเข้าใช้ใน Android Games

หากต้องการดูตัวอย่างโค้ดโดยละเอียดที่แสดงวิธีใช้ Google Sign-In ในการตรวจสอบสิทธิ์โปรแกรมเล่น โปรดดู มีตัวอย่าง clientserverskeleton รายการใน GitHub

โปรดทำตามขั้นตอนต่อไปนี้สำหรับการเข้าถึงแบบออฟไลน์

  1. ใน Google Play Console: สร้างข้อมูลเข้าสู่ระบบสำหรับเซิร์ฟเวอร์เกม ประเภทไคลเอ็นต์ OAuth ของข้อมูลเข้าสู่ระบบจะเป็น "เว็บ"
  2. ในแอป Android: ในการลงชื่อเข้าใช้ ให้ขอรหัสการตรวจสอบสิทธิ์เซิร์ฟเวอร์ ข้อมูลเข้าสู่ระบบของเซิร์ฟเวอร์ และส่งผ่านไปยังเซิร์ฟเวอร์ของคุณ
  3. ในเซิร์ฟเวอร์เกม: แลกเปลี่ยนรหัสการตรวจสอบสิทธิ์เซิร์ฟเวอร์สำหรับการเข้าถึง OAuth โดยใช้บริการการตรวจสอบสิทธิ์ของ Google จากนั้นใช้โทเค็นนี้เพื่อเรียกใช้ API ของ REST ในบริการเกมของ Play

ก่อนเริ่มต้น

ก่อนจะผสานรวม Google Sign-In ลงในเกมได้ ก่อนอื่นคุณต้องเพิ่มเกมลงใน Google Play Console ตามที่อธิบายไว้ใน การตั้งค่าบริการเกมของ Google Play

สร้างเว็บแอปพลิเคชันฝั่งเซิร์ฟเวอร์ที่เชื่อมโยงกับเกมของคุณ

บริการเกมของ Google Play ไม่มีแบ็กเอนด์ ที่สนับสนุนเกมบนเว็บ แต่จะให้การสนับสนุนเซิร์ฟเวอร์แบ็กเอนด์ สำหรับเซิร์ฟเวอร์เกม Android ของคุณ

หากคุณต้องการใช้ REST API สำหรับบริการเกมของ Google Play ในแอปฝั่งเซิร์ฟเวอร์ ให้ทำตามขั้นตอนต่อไปนี้

  1. สร้างเว็บแอปที่เชื่อมโยงสำหรับเกมของคุณในส่วนแอปที่เชื่อมโยงของ Google Play Console โปรดทราบว่า ไม่ได้ใช้ launch_url สำหรับขั้นตอนนี้และเว้นว่างไว้ได้
  2. หากต้องการรับข้อมูลเข้าสู่ระบบของแอป ให้ทำตามขั้นตอนต่อไปนี้
    1. จากเกมใน Google Play Console ให้คลิกรายละเอียดเกม
    2. เลื่อนลงไปที่ส่วนโครงการคอนโซล API แล้วคลิกลิงก์ กับโปรเจ็กต์คอนโซล API
    3. จาก API และ บริการ > หน้าจอข้อมูลเข้าสู่ระบบใน Google API Console ให้ดาวน์โหลดไฟล์ client_secret.json สำหรับเว็บแอป และบันทึกไว้ในตำแหน่งที่เซิร์ฟเวอร์ของคุณสามารถเข้าถึงได้ บันทึกไคลเอ็นต์ รหัสของข้อมูลเข้าสู่ระบบสำหรับใช้อ้างอิงในภายหลัง
  3. รีสตาร์ทแอปฝั่งเซิร์ฟเวอร์เพื่อให้พร้อมรับคำขอจาก แอปไคลเอ็นต์ของเกม

กำลังดำเนินการลงชื่อเข้าใช้บนไคลเอ็นต์

คลาส GoogleSignInClient เป็นจุดแรกเข้าหลักในการดึงข้อมูลบัญชีของบัญชี โปรแกรมเล่นที่ลงชื่อเข้าใช้แล้ว และการลงชื่อเข้าใช้โปรแกรมเล่นหากยังไม่เคยทำมาก่อนในแอปของคุณใน อุปกรณ์

หากต้องการสร้างไคลเอ็นต์การลงชื่อเข้าใช้ ให้ทำตามขั้นตอนต่อไปนี้

  1. สร้างไคลเอ็นต์การลงชื่อเข้าใช้ผ่านออบเจ็กต์ GoogleSignInOptions ใน GoogleSignInOptions.Builder เพื่อกำหนดค่าการลงชื่อเข้าใช้ของคุณ คุณต้องระบุ GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN
  2. คุณต้องระบุด้วยว่าเกมของคุณต้องมีการตรวจสอบสิทธิ์ สำหรับเซิร์ฟเวอร์แบ็กเอนด์ด้วยการเรียก เมธอด GoogleSignInOptions.Builder.requestServerAuthCode() ที่มีรหัสไคลเอ็นต์ของเซิร์ฟเวอร์เป็นเมธอด พารามิเตอร์ คุณจะเรียกรหัสการตรวจสอบสิทธิ์ในภายหลังสำหรับโทเค็นเพื่อการเข้าถึงในเซิร์ฟเวอร์แบ็กเอนด์ ตามที่อธิบายไว้ ในหัวข้อรับรหัสการตรวจสอบสิทธิ์ของเซิร์ฟเวอร์
  3. เรียกใช้เมธอด GoogleSignIn.getClient() และส่งในตัวเลือกที่คุณกำหนดค่าไว้ก่อนหน้านี้ หากการโทร Google Sign-In API จะแสดงอินสแตนซ์ของ GoogleSignInClient
  4. เมื่อได้รับอินสแตนซ์ GoogleSignInClient แล้ว คุณควรดำเนินการต่อเพื่อลงชื่อเข้าใช้โปรแกรมเล่น จาก onResume() ของกิจกรรมอย่างเงียบๆ ตามที่อธิบายไว้ใน กำลังลงชื่อเข้าใช้แบบเงียบ

เช่น

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);
}

รับรหัสการตรวจสอบสิทธิ์ของเซิร์ฟเวอร์

วิธีเรียกรหัสการตรวจสอบสิทธิ์เซิร์ฟเวอร์ที่เกมสามารถใช้สำหรับโทเค็นเพื่อการเข้าถึงในเซิร์ฟเวอร์แบ็กเอนด์ โทรหา getServerAuthCode() ใน GoogleSignInAccount ออบเจ็กต์ Google Sign-In จะแสดงผลเมื่อลงชื่อเข้าใช้โปรแกรมเล่นสำเร็จ

เช่น


// 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();
    }
  }
}

แลกเปลี่ยนรหัสการตรวจสอบสิทธิ์เซิร์ฟเวอร์กับโทเค็นเพื่อการเข้าถึงบนเซิร์ฟเวอร์

ส่งรหัสการตรวจสอบสิทธิ์เซิร์ฟเวอร์ไปยังเซิร์ฟเวอร์แบ็กเอนด์ของคุณเพื่อแลกเปลี่ยนสำหรับการเข้าถึงและรีเฟรชโทเค็น ใช้โทเค็นเพื่อการเข้าถึงเพื่อเรียกใช้ API บริการเกมของ Google Play ในนามของผู้เล่น และหากต้องการ จัดเก็บโทเค็นการรีเฟรชเพื่อรับโทเค็นเพื่อการเข้าถึงใหม่เมื่อโทเค็นเพื่อการเข้าถึงหมดอายุ

ข้อมูลโค้ดต่อไปนี้แสดงวิธีการที่คุณสามารถติดตั้งโค้ดฝั่งเซิร์ฟเวอร์ใน Java ภาษาการเขียนโปรแกรมเพื่อแลกเปลี่ยนรหัสการตรวจสอบสิทธิ์ของเซิร์ฟเวอร์สำหรับโทเค็นเพื่อการเข้าถึง ใช่เลย โดยใช้ 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;
}

หากต้องการดูข้อมูลเพิ่มเติมเกี่ยวกับการเข้าถึง Google API จากเซิร์ฟเวอร์แบ็กเอนด์ในนามของโปรแกรมเล่นที่ลงชื่อเข้าใช้ ดูการเปิดใช้การเข้าถึงฝั่งเซิร์ฟเวอร์

จัดการเกี่ยวกับการออกจากระบบของโปรแกรมเล่น

หากต้องการนำผู้เล่นออกจากเกม ให้เรียกเมธอด signOut() ใน GoogleSignInClient สำหรับ ดูตัวอย่างข้อมูลโค้ด การนำโปรแกรมเล่นออก

เรียก REST API จากเซิร์ฟเวอร์

โปรดดู REST API สำหรับบริการเกมของ Google Play สำหรับ คำอธิบายแบบเต็มของการเรียก API ที่ใช้ได้

ตัวอย่างการเรียก REST API ที่อาจเป็นประโยชน์กับคุณมีดังนี้

ผู้เล่น

  • ต้องการขอรหัสและข้อมูลโปรไฟล์ผู้เล่นที่ลงชื่อเข้าใช้ไหม โทรหา Players.get โดยมี 'me' เป็นรหัส

เพื่อน

โปรดอ่านคู่มือเพื่อน ซึ่งจะอธิบายเกี่ยวกับเพื่อนได้ละเอียดยิ่งขึ้น

  • ต้องการเรียกรายชื่อเพื่อนของผู้เล่นไหม เรียก Players.list ด้วย 'friends_all' ในฐานะ collection
  • ตรวจสอบว่าคุณมีสิทธิ์เข้าถึงรายชื่อเพื่อนหรือไม่ โทรหา Players.get สําหรับ me และ ดูที่ช่อง profileSettings.friendsListVisibility ในคำตอบ

ความสำเร็จ

อย่าลืมอ่านคู่มือรางวัลพิเศษซึ่งอธิบายถึงรางวัลพิเศษ การใช้งานได้มากขึ้น

  • ต้องการดูรายการรางวัลพิเศษในปัจจุบันไหม คุณสามารถโทรไปที่ AchievementDefinitions.list ได้
  • ให้รวมข้อมูลดังกล่าวกับการเรียกไปที่ Achievements.list เพื่อดูว่าผู้เล่นปลดล็อกรายการใดบ้าง
  • ผู้เล่นได้รับรางวัลพิเศษไหม ใช้ Achievements.unlock เพื่อปลดล็อก!
  • ผู้เล่นเล่นเกมผ่านรางวัลพิเศษบางส่วนไหม ใช้ Achievements.increment เพื่อ ความคืบหน้าของรายงาน (และดูว่าโปรแกรมเล่นได้ปลดล็อกหน้าจอหรือไม่)
  • คุณกำลังแก้ไขข้อบกพร่องของเกมที่ยังไม่เป็นเวอร์ชันที่ใช้งานจริงใช่ไหม ลองโทร Achievements.reset หรือ Achievements.resetAll จาก Management API เพื่อรีเซ็ตรางวัลพิเศษเป็นสถานะเดิม

ลีดเดอร์บอร์ด

อย่าลืมอ่านคู่มือลีดเดอร์บอร์ด ซึ่งอธิบายเกี่ยวกับลีดเดอร์บอร์ดได้ละเอียดมากขึ้น

  • อยากดูตารางคะแนนทั้งหมดในเกมไหม โทรไปยัง Leaderboards.list
  • ผู้เล่นเล่นเกมเสร็จแล้วไหม คุณสามารถส่งคะแนนไปที่ Scores.submit และดูว่า นี่คือคะแนนสูงสุดใหม่
  • ต้องการแสดงลีดเดอร์บอร์ดใช่ไหม รับข้อมูลจาก Scores.list แล้วแสดงต่อผู้ใช้
  • ใช้ Scores.listWindow เพื่อค้นหาการจัดประเภทคะแนนที่ใกล้เคียงกับคะแนนสูงสุดของผู้ใช้
  • หากต้องการทราบข้อมูลเพิ่มเติมเกี่ยวกับคะแนนของผู้เล่นในลีดเดอร์บอร์ดหนึ่งๆ (ตัวอย่างเช่น หาก ผู้เล่นอยู่ใน 12% แรกของผู้เล่นทั้งหมด) ให้โทรหา Scores.get
  • คุณจะแก้ไขข้อบกพร่องของเกมใช่ไหม ลองเรียก Scores.reset จากการจัดการ API สำหรับรีเซ็ตคะแนนทั้งหมดสำหรับผู้เล่นรายนั้นจากลีดเดอร์บอร์ดหนึ่งๆ