Google Play Oyun Hizmetleri'ne Sunucu Tarafı Erişimi Etkinleştirme

Oyuncuların kimliklerini doğrulamanızı ve Oynatıcının kimliğini arka uç sunucusuna güvenli bir şekilde iletmelidir. Bu durumda, oyuncunun kimliğini ve diğer verilerini güvenli bir şekilde almak için oyununuza Cihazdan geçerken olası kurcalamalara maruz kalma.

Bu senaryoda, oyuncu başarılı bir şekilde oturum açtıktan sonra Play Games Hizmetleri v2 SDK'sından tek kullanımlık özel bir kod (sunucu kimlik doğrulama kodu olarak adlandırılır) isteyebilirsiniz. Bu kodu istemci sunucuya iletir. Ardından, sunucuda sunucu kimlik doğrulama kodunu, sunucunun Google Play Games Hizmetleri API'sine çağrı yapmak için kullanabileceği bir OAuth 2.0 jetonuyla değiştirin.

Oyunlarınıza oturum açma özelliği ekleme hakkında daha fazla bilgi için şuraya bakın: Android Games'de oturum açın.

Çevrimdışı erişim için aşağıdaki adımlar gereklidir:

  1. Google Play Console'da: Oyun sunucunuz için bir kimlik bilgisi oluşturun. Kimlik bilgisinin OAuth istemci türü "web" olur.
  2. Android uygulamasında: Oturum açma işleminin bir parçası olarak ve sunucunuza iletmeniz gerekir.
  3. Oyun sunucunuzda: Google kimlik doğrulama hizmetlerini kullanarak sunucu kimlik doğrulama kodunu OAuth erişim jetonuyla değiştirin ve ardından Play Games Hizmetleri REST API'lerini çağırmak için bu jetonu kullanın.

Başlamadan önce

Öncelikle, Google Play Games Hizmetleri'ni Ayarlama bölümünde açıklandığı gibi oyununuzu Google Play Console'a eklemeniz ve Play Games Hizmetleri Oturum Açma özelliğini oyununuza entegre etmeniz gerekir.

Oyununuz için ilişkilendirilmiş bir sunucu tarafı web uygulaması oluşturun

Google Play Oyun Hizmetleri, web oyunları için arka uç desteği sağlamaz. Ancak arka uç sunucu desteği sunar. kullanabilirsiniz.

Sunucu tarafı uygulamanızda Google Play Games hizmetleri için REST API'lerini kullanmak istiyorsanız aşağıdaki adımları uygulayın:

  1. Google Play Console'daki oyununuzdan Play Games Hizmetleri > Kurulum ve yönetim > Yapılandırma.
  2. Kimlik bilgisi ekleme sayfasına yönlendirilmek için Kimlik bilgisi ekle'yi seçin. Kimlik bilgisi türü olarak Oyun sunucusu'nu seçin ve Yetkilendirme bölümüne geçin.
    1. Oyun sunucunuzun zaten bir OAuth istemci kimliği varsa açılır menüden bunu seçin. Değişikliklerinizi kaydettikten sonra sonraki bölüme geçin.
    2. Oyun sunucunuz için mevcut bir OAuth istemci kimliğiniz yoksa oluşturabilirsiniz.
      1. OAuth istemcisi oluştur'u tıklayın ve OAuth istemci kimliği oluştur bağlantısını takip edin.
      2. Bu işlem sizi, oyununuzun ilişkili Cloud Platform projesi için Google Cloud Platform'un OAuth İstemci Kimliği Oluştur sayfasına yönlendirir.
      3. Sayfanın formunu doldurun ve Oluştur'u tıklayın. Uygulama türünü Web uygulaması olarak ayarladığınızdan emin olun.
      4. Add Credential page's Authorization (Kimlik bilgisi ekleme sayfasının Yetkilendirme) bölümüne dönün, yeni oluşturulan OAuth istemcisini seçin ve değişikliklerinizi kaydedin.

Sunucu kimlik doğrulama kodunu alma

Oyununuzun arka uç sunucunuzdaki erişim jetonları için kullanabileceği bir sunucu kimlik doğrulama kodu almak üzere:

  1. İstemciden requestServerSideAccess'ü arayın.

    1. Android uygulamanızın OAuth istemci kimliğini değil, oyun sunucunuz için kayıtlı OAuth istemci kimliğini kullandığınızdan emin olun.
    2. (İsteğe bağlı) Oyun sunucunuz Play Games Hizmetleri'ne çevrimdışı erişim (yeniden yenileme jetonu kullanan uzun süreli erişim) gerektiriyorsa forceRefreshToken parametresini true olarak ayarlayabilirsiniz.
    GamesSignInClient gamesSignInClient = PlayGames.getGamesSignInClient(this);
    gamesSignInClient
      .requestServerSideAccess(OAUTH_2_WEB_CLIENT_ID, /* forceRefreshToken= */ false)
      .addOnCompleteListener( task -> {
        if (task.isSuccessful()) {
          String serverAuthToken = task.getResult();
          // Send authentication code to the backend game server to be
          // exchanged for an access token and used to verify the player
          // via the Play Games Services REST APIs.
        } else {
          // Failed to retrieve authentication code.
        }
    });
    
  2. Değiştirilmesi için OAuth kimlik doğrulama kodu jetonunu arka uç sunucunuza gönderin, oyuncu kimliği Play Games Hizmetleri REST API'lerine göre doğrulandıktan sonra oyununuzla kimliği doğrulanır.

Sunucudaki erişim jetonu için sunucu kimlik doğrulama kodunu değiştirin

Erişim ve yenileme jetonları almak için sunucu yetkilendirme kodunu arka uç sunucunuza gönderin. Oynatıcı adına Google Play Games Hizmetleri API'sini çağırmak için erişim jetonunu kullanın ve isteğe bağlı olarak erişim jetonunun süresi dolduğunda yeni bir erişim jetonu almak için yenileme jetonunu depolamanız gerekir.

Aşağıdaki kod snippet'inde, sunucu kimlik doğrulama kodunu erişim jetonlarıyla değiştirmek için sunucu tarafı kodunu Java programlama dilinde nasıl uygulayabileceğiniz gösterilmektedir. Evet her bir arama terimi için clientserverskeleton örnek uygulaması:

/**
 * 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;
}

Sunucudan REST API'leri çağırma

Google Play Games hizmetleri için REST API'ler başlıklı makaleyi inceleyin. mevcut API çağrılarının tam açıklamasını görebilirsiniz.

Faydalı bulabileceğiniz REST API çağrısı örnekleri şunlardır:

Oyuncu

  • Oturum açmış oyuncunun kimliğini ve profil verilerini almak mı istiyorsunuz? Kimlik olarak 'me' ile Players.get'i çağırın.

Arkadaşlar

Arkadaşlar'ı daha ayrıntılı olarak açıklayan Arkadaş kılavuzunu inceleyin.

Başarılar

Başarılar hakkında daha ayrıntılı bilgi edinmek için Başarılar kılavuzunu inceleyin.

  • Mevcut başarıların listesini görmek ister misiniz? AchievementDefinitions.list işlevini çağırabilirsiniz.
  • Oynatıcının kilidini hangi başarıların kilidini açtığını öğrenmek için bunu Achievements.list çağrısıyla birleştirin.
  • Oyuncu bir başarı kazandı mı? Kilidini açmak için Achievements.unlock işlevini kullanın.
  • Oyuncu, kısmi bir başarıya doğru ilerleme kaydetti mi? İlerlemeyi bildirmek (ve oyuncunun kilidini açıp açmadığını öğrenmek) için Achievements.increment işlevini kullanın.
  • Henüz üretimde olmayan bir oyunda hata ayıklıyor musunuz? Aramayı deneyin Yönetim API'lerinden Achievements.reset veya Achievements.resetAll başarıları orijinal hallerine sıfırlayın.

Skor tabloları

Skor tabloları hakkında daha ayrıntılı bilgi veren Skor Tabloları kılavuzunu incelediğinizden emin olun.

  • Oyundaki tüm skor tablolarının listesini almak ister misiniz? Leaderboards.list'e çağrı yapın.
  • Oyuncunun oyunu bitirdi mi? Puanlarını Scores.submit adresine gönderebilir ve bu yeni bir rekor.
  • Skor tablosu görüntülemek ister misiniz? Scores.list'ten alınan verileri alın ve kullanıcıya gösterin.
  • Kullanıcının rekoruna yakın çeşitli puanları bulmak için Scores.listWindow'u kullanın.
  • Oyuncunun belirli bir skor tablosundaki puanı hakkında daha fazla bilgi edinmek için (ör. oyuncu tüm oyuncuların en iyi %12'sindeyse) Scores.get işlevini çağırın.
  • Bir oyunda hata ayıklama mı yapıyorsunuz? Belirli bir skor tablosundaki oyuncunun tüm skorlarını sıfırlamak için Yönetim API'lerinden Scores.reset işlevini çağırmayı deneyin.