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

Oyununuz bir arka uç sunucusu kullanıyorsa oyuncuların kimliğini doğrulamak için Google ile Oturum Açma özelliğini kullanmanızı ve oyuncu kimliğini arka uç sunucusuna güvenli bir şekilde iletmenizi öneririz. Bu aynı zamanda oyununuzun, cihaz üzerinden oynarken olası izinsiz girişlere maruz kalmadan oyuncu kimliğini ve diğer verileri güvenli bir şekilde alabilmesini sağlar.

Bu senaryoda oyununuz, oyuncudan her zamanki gibi Google Play oyun hizmetlerinde oturum açmasını ister. Oynatıcı başarıyla oturum açtığında GoogleSignInAccount nesnesi, istemcinin sunucuya ilettiği özel tek kullanımlık kodu (sunucu kimlik doğrulama kodu olarak adlandırılır) içerir. Ardından, sunucudaki sunucu kimlik doğrulama kodunu, sunucunun Google Play Games Services API'ye çağrı yapmak için kullanabileceği bir OAuth 2.0 jetonuyla değiştirin.

Oyunlarınıza oturum açma ekleme hakkında daha fazla bilgi için Android Oyunlarında oturum açma bölümüne göz atın.

Oyuncuların kimliğini doğrulamak için Google ile Oturum Açma özelliğinin nasıl kullanılacağını gösteren ayrıntılı bir kod örneği görmek için GitHub'daki clientserverskeleton örneğini inceleyin.

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

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

Başlamadan önce

Google ile Oturum Açma özelliğini oyununuza entegre edebilmek için önce Google Play Oyun Hizmetleri'ni kurma bölümünde açıklandığı gibi oyununuzu Google Play Console'a eklemeniz gerekir.

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

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 taraflı 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'un Bağlı Uygulamalar bölümünde oyununuz için ilişkili bir web uygulaması oluşturun. launch_url öğesinin bu akış için kullanılmadığını ve boş bırakılabileceğini unutmayın.
  2. Uygulamanıza ait kimlik bilgisi bilgilerini almak için aşağıdaki adımları uygulayın:
    1. Google Play Console'daki oyununuzdan Oyun Ayrıntıları'nı tıklayın.
    2. API Konsolu Projesi bölümüne gidin ve API konsolu projesinin bağlantısını tıklayın.
    3. Google API Konsolu'ndaki API'ler ve Hizmetler > Kimlik Bilgileri ekranından, web uygulamanız için client_secret.json dosyasını indirin ve sunucunuzun erişebileceği bir konuma kaydedin. Daha sonra başvurmak üzere kimlik bilgilerinin istemci kimliğini kaydedin.
  3. Oyununuzun istemci uygulamasından gelen istekleri kabul etmeye hazır olması için sunucu tarafı uygulamanızı yeniden başlatın.

İstemcide oturum açma

GoogleSignInClient sınıfı, o anda oturum açmış olan oyuncunun hesabını almak ve cihazda daha önce uygulama içinde oturum açmamışsa oturum açmak için kullanılan ana giriş noktasıdır.

Oturum açma istemcisi oluşturmak için aşağıdaki adımları uygulayın:

  1. GoogleSignInOptions nesnesi aracılığıyla bir oturum açma istemcisi oluşturun. Oturum açma işleminizi yapılandırmak için GoogleSignInOptions.Builder sayfasında GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN değerini belirtmeniz gerekir.
  2. Ayrıca, parametre olarak GoogleSignInOptions.Builder.requestServerAuthCode() yöntemini sunucunun istemci kimliği ile çağırarak oyununuzun arka uç sunucunuz için bir yetkilendirme kodu gerektirdiğini belirtmelisiniz. Sunucu kimlik doğrulaması kodunu alma bölümünde açıklandığı gibi, arka uç sunucunuzdaki erişim jetonları için kimlik doğrulama kodunu daha sonra alırsınız.
  3. GoogleSignIn.getClient() yöntemini çağırın ve daha önce yapılandırdığınız seçenekleri iletin. Arama başarılı olursa Google ile Oturum Açma API'si GoogleSignInClient örneğini döndürür.
  4. GoogleSignInClient örneğini aldıktan sonra, Sessiz oturum açma bölümünde açıklandığı gibi oyuncunun onResume() etkinliğinden sessizce oturum açmalısınız.

Aşağıda bununla ilgili bir örnek verilmiştir:

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

Sunucu yetkilendirme kodunu alma

Oyununuzun arka uç sunucunuzdaki erişim jetonları için kullanabileceği bir sunucu kimlik doğrulama kodu almak üzere, Google ile Oturum Açma özelliğinin başarılı oyuncu oturumu açma işlemiyle döndürdüğü GoogleSignInAccount nesnesindeki getServerAuthCode() yöntemini çağırın.

Aşağıda bununla ilgili bir örnek verilmiştir:


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

Sunucudaki bir erişim jetonu için sunucu yetkilendirme kodunu değiştirme

Erişim ve yenileme jetonlarını değiştirmek için sunucu kimlik doğrulama 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 depolayın.

Aşağıdaki kod snippet'i, erişim jetonları için sunucu kimlik doğrulama kodunu değiştirmek üzere Java programlama dilinde sunucu tarafı kodunu nasıl uygulayabileceğinizi gösterir. 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 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;
}

Oturum açmış bir oyuncu adına Google arka uç sunucularından Google API'lerine erişme hakkında daha fazla bilgi edinmek için Sunucu Tarafı Erişimini Etkinleştirme bölümüne bakın.

Oyuncu oturumunu kapatma

Oyuncuların oyununuzun oturumunu kapatmak için GoogleSignInClient üzerinden signOut() yöntemini çağırın. Örnek kod snippet'i için Oyuncunun oturumunu kapatma bölümüne bakın.

Sunucudan REST API'lerini çağırın

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

Faydalı bulabileceğiniz REST API çağrılarına örnekler:

Oyuncu

  • Oturum açmış oyuncuların kimliğini ve profil verilerini almak ister misiniz? Kimlik olarak 'me' ile Players.get'i arayın.

Arkadaşlar

Arkadaşlarınızı daha ayrıntılı bir şekilde açıklayan Arkadaşlar kılavuzunu incelediğinizden emin olun.

Başarılar

Başarıları daha ayrıntılı olarak açıklayan Başarılar kılavuzunu incelediğinizden emin olun.

  • Mevcut başarıların listesini almak ister misiniz? AchievementDefinitions.list için arama yapabilirsiniz.
  • Bunları, Achievements.list çağrısıyla birleştirerek oyuncunun hangi kilidi açtığını öğrenebilirsiniz.
  • Oyuncu başarılı oldu mu? Kilidi açmak için Achievements.unlock bağlantısını kullanın.
  • Oyuncu kısmi bir başarıya ulaştı mı? İlerlemeyi bildirmek (ve oyuncunun kilidi açıp açmadığını öğrenmek) için Achievements.increment özelliğini kullanın.
  • Henüz üretimde olmayan bir oyunda hata ayıklama mı yapıyorsunuz? Başarıları orijinal durumlarına sıfırlamak için Yönetim API'lerinden Achievements.reset veya Achievements.resetAll komutunu çağırmayı deneyin.

Skor tabloları

Skor tablolarını daha ayrıntılı olarak açıklayan 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.
  • Oyuncu bir oyunu bitirdi mi? Puanlarını Scores.submit’a gönderebilir ve bunun yeni bir yüksek puan olup olmadığını öğrenebilirsiniz.
  • Skor tablosunu görüntülemek ister misiniz? Scores.list verilerinden veri alın ve kullanıcıya gösterin.
  • Kullanıcının en yüksek puanına yakın bir puan yelpazesini bulmak için Scores.listWindow metriğini kullanın.
  • Belirli bir skor tablosunda oyuncunun skoru hakkında daha fazla bilgi edinmek için (örneğin, oyuncu tüm oyuncuların ilk% 12'lik dilimindeyse) Scores.get'i arayın.
  • Bir oyunda hata ayıklama mı yapıyorsunuz? Belirli bir skor tablosunda o oyuncuya ait tüm skorları sıfırlamak için Management API'lerinden Scores.reset çağrısı yapmayı deneyin.