Google Play Oyun Hizmetleri'ne sunucu tarafı erişimini etkinleştir

Oyununuzda arka uç sunucu kullanılıyorsa oyuncuların kimliğini doğrulamak ve oyuncunun kimliğini arka uç sunucuya güvenli bir şekilde aktarmak için Google ile oturum açma özelliğini kullanmanızı öneririz. Bu ayrıca oyununuz, cihazdan geçerken olası kurcalamalara maruz kalmadan oyuncunun kimliğini ve diğer verilerini güvenli bir şekilde alabilir.

Bu senaryoda oyununuz, oyuncudan her zamanki gibi Google Play Games Hizmetleri'nde oturum açmasını ister. Oynatıcı başarıyla oturum açtığında GoogleSignInAccount nesnesi, istemcinin sunucuya aktardığı özel bir tek kullanımlık kod (sunucu kimlik doğrulama kodu olarak adlandırılır) içerir. Ardından, sunucudaki 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 özelliği ekleme hakkında daha fazla bilgi için Android Oyunlarında Oturum Açma başlıklı makaleyi inceleyin.

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ğini görmek istiyorsanız GitHub'daki clientserverskeleton örneğine göz atı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 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

Google ile oturum açma özelliğini oyununuza entegre edebilmek için öncelikle Google Play Games Hizmetleri'ni ayarlama 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şturma

Google Play Oyun 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'un Bağlı Uygulamalar bölümünde oyununuz için ilişkili bir web uygulaması oluşturun. launch_url değerinin bu akış için kullanılmadığını ve boş bırakılabileceğini unutmayın.
  2. Uygulamanızın kimlik bilgisini almak için aşağıdaki adımları uygulayın:
    1. Google Play Console'daki oyununuzda Oyun Ayrıntıları'nı tıklayın.
    2. API Konsolu Projesi bölümüne gidin ve API konsolu projesine giden bağlantıyı tıklayın.
    3. Google API Console'daki API'ler ve Hizmetler > Kimlik Bilgileri ekranından web uygulamanızın client_secret.json dosyasını indirin ve sunucunuzun erişebileceği bir konuma kaydedin. Daha sonra başvurmak üzere kimlik bilgisinin 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ı, oturumu açık olan oyuncunun hesabını almak ve daha önce cihazdaki uygulamanızda bunu yapmamışlarsa oynatıcının oturumunu açmak için 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 oturum açma istemcisi oluşturun. Oturum açma ayarlarınızı yapılandırmak için GoogleSignInOptions.Builder bölümünde GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN değerini belirtmeniz gerekir.
  2. Ayrıca, oyununuzun arka uç sunucunuz için bir kimlik doğrulama kodu gerektirdiğini belirtmek üzere GoogleSignInOptions.Builder.requestServerAuthCode() yöntemini parametre olarak sunucunun istemci kimliğiyle çağırmanız gerekir. Sunucu yetkilendirme kodunu alma bölümünde açıklandığı gibi, arka uç sunucunuzdaki erişim jetonları için yetkilendirme 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. Çağrı başarılı olursa Google ile Oturum Açma API'si, GoogleSignInClient örneği döndürür.
  4. GoogleSignInClient örneğini aldıktan sonra, Sessiz oturum açma işlemi gerçekleştirme başlıklı makalede açıklandığı gibi, oynatıcıyı etkinliğin onResume() bölümünden sessiz bir şekilde imzalamanız gerekir.

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 kimlik doğrulama kodunu alma

Oyununuzun arka uç sunucunuzda 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ı bir oyuncu oturumu açıldığında döndürdüğü GoogleSignInAccount nesnesinde 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 erişim jetonu için sunucu kimlik doğrulama kodunu değiştirin

Erişim ve yenileme jetonlarıyla değiştirmek için sunucu kimlik doğrulama kodunu arka uç sunucunuza gönderin. Oyuncu adına Google 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 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 arka uç sunucudan Google API'lerine erişim hakkında daha fazla bilgi edinmek için Sunucu Tarafı Erişimi Etkinleştirme başlıklı makaleyi inceleyin.

Oyuncuların oturumunu kapatma

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

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

Arkadaşlar hakkında daha ayrıntılı bilgi içeren Arkadaşlar kılavuzunu incelediğinizden emin olun.

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 almak 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 Başarılar.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ıklama yapıyor musunuz? Başarıları orijinal durumuna sıfırlamak için Yönetim API'lerinden Başarılar.reset veya Başarılar.resetAll'i çağırmayı deneyin.

Skor tabloları

Skor tablolarını daha ayrıntılı olarak açıklayan Skor Tabloları kılavuzunu inceleyin.

  • Oyundaki tüm skor tablolarının listesini almak ister misiniz? Leaderboards.list işlevini çağırın.
  • Oyuncunun oyunu bitirdi mi? Puanını Scores.submit adresine göndererek yeni bir rekor olup olmadığını öğrenebilirsiniz.
  • Skor tablosu görüntülemek mi istiyorsunuz? Scores.list'ten alınan verileri alın ve kullanıcıya gösterin.
  • Kullanıcının en yüksek puanına yakın bir puan grubu bulmak için Scores.listWindow'ı 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.