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

Oyuncuların kimliğini doğrulamanızı ve oyuncunun kimliğini arka uç sunucuya güvenli bir şekilde iletmenizi öneririz. Bu sayede oyununuz, cihazdan geçerken olası müdahalelere maruz kalmadan oyuncunun kimliğini ve diğer verilerini güvenli bir şekilde alabilir.

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 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 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 bilgileri için sunucu kimlik doğrulama kodu isteyin ve bu kodu sunucunuza iletin.
  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 ile oturum açma özelliğini 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 aşağıdaki adımları uygulayın:

  1. Google Play Console'da bir oyun seçin.
  2. Play Games Hizmetleri > Kurulum ve yönetim > Yapılandırma'ya gidin.
  3. 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 sunucunuzda 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 yeni bir kimlik 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, oyununuzla ilişkili projeniz için Google Cloud Platform'un OAuth İstemci Kimliği Oluşturma 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. 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 sunucunuzun Play Games Hizmetleri'ne çevrimdışı erişim (yeniden yenileme jetonu kullanan uzun süreli erişim) gerektirmesi durumunda 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 kimlik doğrulama kodu jetonunu arka uç sunucunuza gönderin. Böylece, oyuncu kimliği Play Games Hizmetleri REST API'lerine göre doğrulanabilir ve ardından oyununuzla kimlik doğrulaması yapılabilir.

Sunucu kimlik doğrulama kodunu gönderme

Erişim ve yenileme jetonlarıyla değiştirmek için sunucu kimlik doğrulama kodunu arka uç sunucunuza gönderin. Oyuncu adına Play Games Hizmetleri API'yi ç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 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. clientserverskeleton örnek uygulamasını kullanır.

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

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

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

  • Oyuncunun arkadaş listesini almak için collection olarak friends_all ile Players.list'i çağırın.

  • Arkadaş listesine erişiminizin olup olmadığını doğrulamak için playerID olarak me değerini kullanarak Players.get işlevini çağırın ve yanıttaki profileSettings.friendsListVisibility alanını görüntüleyin.

Başarılar

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

  • Mevcut başarıların listesini almak için AchievementDefinitions.list işlevini çağırın.

  • Bu bilgileri, oyuncunun hangi başarıların kilidini açtığını öğrenmek için Achievements.list çağrısıyla birlikte kullanın.

  • Bir oyuncunun başarısını açmak için Achievements.unlock işlevini çağırın.

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

  • Üretime ulaşmamış bir oyunda hata ayıklama yapıyorsanız başarıları orijinal durumlarına sıfırlamak için Yönetim API'lerinden Achievements.reset veya Achievements.resetAll'ı çağırabilirsiniz.

Skor tabloları

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

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

  • Bir oyuncu oyununu tamamladığında, skorunu Scores.submit işlevine göndererek yeni bir rekor olup olmadığını öğrenebilirsiniz.

  • Lider tablosunu görüntülemek için Scores.list kaynağından verileri alın ve kullanıcıya gösterin.

  • Kullanıcının en yüksek puanına yakın puanların bir listesini bulmak için Scores.listWindow işlevini kullanın.

  • Belirli bir lider tablosundaki oyuncunun 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 yapıyorsanız belirli bir skor tablosundaki oyuncunun tüm skorlarını sıfırlamak için Yönetim API'lerinden Scores.reset işlevini çağırabilirsiniz.