Google Play Games Hizmetleri'ne sunucu tarafı erişim

Oyuncuların kimliğini doğrulamanızı ve oynatıcının kimliğini arka uç sunucuya güvenli bir şekilde iletmenizi öneririz. Bu şekilde oyununuz, cihazdan geçerken olası değişikliklere maruz kalmadan oyuncunun kimliğini ve diğer verileri güvenli bir şekilde alır.

Bu senaryoda, oynatıcı başarıyla oturum açtıktan sonra Play Games Services v2 SDK'sından istemcinin sunucuya ilettiği özel tek kullanımlık bir kod (sunucu yetkilendirme kodu denir) isteyebilirsiniz. Ardından sunucuda, sunucu yetkilendirme kodunu bir OAuth 2.0 jetonuyla değiştirin. Sunucu, Google Play Games Services API'ye çağrı yapmak için bu jetonu kullanabilir.

Oyunlarınıza oturum açma bilgisi ekleme hakkında daha fazla bilgi için Android Oyunlar için oturum açma başlıklı makaleyi inceleyin.

Ç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, sunucunuzun kimlik bilgisi için bir sunucu yetkilendirme kodu isteyin ve bunu sunucunuza iletin.
  3. Oyun sunucunuzda: Google kimlik doğrulama hizmetlerini kullanarak OAuth erişim jetonu için sunucu yetkilendirme kodunu değiştirin, ardından bunu kullanarak Play Games Hizmetleri REST API'lerini çağırın.

Başlamadan önce

İlk olarak Google Play Games Hizmetleri'ni kurma bölümünde açıklandığı gibi Google Play Console'a oyununuzu eklemeniz ve Play Games Hizmetleri ile Oturum Açma'yı oyununuza entegre etmeniz gerekir.

Sunucu tarafı web uygulaması oluşturma

Google Play Games hizmetleri, web oyunları için arka uç desteği sağlamaz. Ancak Android oyununuzun sunucusu için arka uç sunucu desteği sağlar.

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

  1. Google Play Console'daki oyununuzdan Play Games Hizmetleri > Kurulum ve yönetim > Yapılandırma'ya gidin.
  2. Kimlik bilgisi ekle'yi seçerek Kimlik bilgisi ekle sayfasına gidin. 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 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 bir tane oluşturabilirsiniz.
      1. OAuth istemcisi oluştur'u tıklayın ve OAuth İstemci Kimliği Oluştur bağlantısını tıklayın.
      2. Oyununuzun ilişkili Cloud Platform projesi için Google Cloud Platform'un OAuth İstemci Kimliği Oluşturma sayfasına yönlendirilirsiniz.
      3. Sayfadaki formu doldurup Oluştur'u tıklayın. Uygulama türünü Web uygulaması olarak ayarladığınızdan emin olun.
      4. 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 yetkilendirme kodunu alın

Oyununuzun arka uç sunucunuzdaki erişim jetonları için kullanabileceği bir sunucu yetkilendirme kodu almak için:

  1. Müşteriden requestServerSideAccess adlı kişiyi ara.

    1. Android uygulamanızın OAuth İstemci Kimliği'ni değil, oyun sunucunuz için kayıtlı OAuth İstemci Kimliği'ni kullandığınızdan emin olun.
    2. (İsteğe bağlı) Oyun sunucunuz, Play Games Hizmetleri'ne çevrimdışı erişim (yenileme jetonu kullanarak uzun ömürlü 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. OAuth yetkilendirme kodu jetonunu arka uç sunucunuza gönderin. Böylece bu jeton değiştirileb

Sunucu yetkilendirme kodunu gönder

Erişim ve yenileme jetonları değişimi için sunucu yetkilendirme kodunu arka uç sunucunuza gönderin. Oynatıcının adına 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 saklayın.

Aşağıdaki kod snippet'inde, sunucu yetkilendirme kodunu erişim jetonlarıyla değiştirmek için Java programlama dilinde sunucu tarafı kodu nasıl uygulayabileceğiniz gösterilmektedir. clientserverskeleton örnek uygulamasını kullanır.

başlıklı makaleyi inceleyin.
/**
 * 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

Kullanılabilir API çağrılarının tam açıklaması için Google Play Games hizmetleri için REST API'lerine bakın.

Yararlı bulabileceğiniz REST API çağrısı örnekleri arasında şunlar yer alır:

Oyuncu

Oturum açmış oyuncunun kimliğini ve profil verilerini almak istiyor musunuz? Kimlik olarak 'me' ile [Players.get][] çağrısı yapın.

Arkadaşlar

Ayrıntılar için Arkadaşlar kılavuzuna bakın.

  • Oyuncunun arkadaş listesini almak için collection olarak friends_all ile Players.list öğesini arayın.

  • Bir arkadaş listesine erişiminiz olup olmadığını doğrulamak için playerID olarak me ile Players.get çağrısı yapın ve yanıttaki profileSettings.friendsListVisibility alanını görüntüleyin.

Başarılar

Ayrıntılar için Başarılar rehberine bakın.

  • Mevcut başarıların listesini almak için Başarı Tanımları.list'i çağırın.

  • Oyuncunun hangilerinin kilidini açtığını öğrenmek için bunu Başarılar.list çağrısı ile birleştirin.

  • Bir oyuncu başarısının kilidini açmak için successments.unlock öğesini çağırın.

  • Bir başarıdaki ilerleme durumunu bildirmek ve oyuncunun başarının kilidini açıp açmadığını öğrenmek için successments.increment ifadesini çağırın.

  • Üretime ulaşmamış bir oyunda hata ayıklayorsanız başarıları orijinal durumuna sıfırlamak için Yönetim API'lerinden Başarılar.Sıfırla veya Başarılar.resetAll'u çağırabilirsiniz.

Skor tabloları

Ayrıntılar için Skor tabloları kılavuzuna bakın.

  • Oyundaki tüm skor tablolarının listesini almak ister misiniz? Leaderboards.list adresine çağrı yapın.

  • Bir oyuncunun maçı bittiğinde skorunu Scores.submit'e gönderebilir ve yeni bir rekor olup olmadığını öğrenebilirsiniz.

  • Skor tablosu görüntülemek için Scores.list sitesinden verileri alın ve kullanıcıya gösterin.

  • Kullanıcının rekoruna yakın skorları bulmak için Scores.listWindow kullanın.

  • Oyuncunun belirli bir skor tablosundaki skoru hakkında daha fazla bilgi edinmek için (örneğin, oyuncu tüm oyuncuların ilk% 12'lik dilimindeyse) Scores.get çağrısı yapın.

  • Bir oyunda hata ayıklayorsanız Yönetim API'lerinden Scores.reset çağrısını yaparak ilgili oyuncunun belirli bir skor tablosundaki tüm skorlarını sıfırlayabilirsiniz.