Standart API isteği yapma

Bu sayfada, entegrasyon kararları için standart API isteklerinde bulunma açıklanmaktadır. Android 5.0 (API düzeyi 21) veya sonraki sürümlerde desteklenir. Böyle bir durumda standart Uygulamanız sunucu çağrısı yaptığında entegrasyon kararı için API isteği kontrol ederek etkileşimin gerçek olup olmadığını kontrol edebilirsiniz.

Genel Bakış

Play Integrity'nin üst düzey tasarımını gösteren sıra şeması
API

Standart bir istek iki bölümden oluşur:

  • Bütünlük jetonu sağlayıcıyı hazırlama (tek seferlik): Bütünlük jetonu sağlayıcıyı ihtiyaç duymadan çok önce hazırlaması için Integrity API'yi kullanın seçeneğini belirlemeniz gerekir. Örneğin bunu, uygulamanız arka planda başlatılmadığından emin olun.
  • Bütünlük jetonu isteme (isteğe bağlı): Uygulamanız sunucu oluşturduğunda kontrol etmek istediğiniz isteğin gerçek olup olmadığını kontrol etmek istiyorsanız ve şifre çözme ile doğrulama için uygulamanızın arka uç sunucusuna gönderin. Daha sonra arka uç sunucunuz ne yapacağına karar verebilir.

Bütünlük jetonu sağlayıcıyı hazırlama (tek seferlik):

  1. Uygulamanız, Google Cloud projenizle bütünlük jetonu sağlayıcıyı çağırıyor sayı.
  2. Uygulamanız, bütünlük jetonu sağlayıcıyı daha fazla işlem için bellekte tutar onay kontrolü çağrıları.

Bütünlük jetonu isteme (isteğe bağlı):

  1. Uygulamanız, korunması gereken kullanıcı işlemi için karmayı hesaplar (SHA256 gibi uygun bir karma algoritması kullanılarak).
  2. Uygulamanız, istek karmasını ileterek bir bütünlük jetonu istiyor.
  3. Uygulamanız, imzalı ve şifrelenmiş bütünlük jetonunu Play'den alır Integrity API'ye dokunun.
  4. Uygulamanız, bütünlük jetonunu uygulamanızın arka ucuna iletir.
  5. Uygulamanızın arka ucu, jetonu bir Google Play sunucusuna gönderir. Google Play sunucu kararın şifresini çözer ve kararı doğrular ve sonuçları uygulamanızın arka uçta olması gerekir.
  6. Uygulamanızın arka ucu, belirtiliyor.
  7. Uygulamanızın arka ucu, karar sonuçlarını uygulamanıza gönderir.

Bütünlük jetonu sağlayıcıyı hazırlama (tek seferlik)

Google Play'den entegrasyon kararı için standart bir istekte bulunmadan önce bütünlük jetonu sağlayıcıyı hazırlamanız (veya "ısıtmanız") gerekir. Bu, Google'ın Bu adımların uygulanması amacıyla, cihazda kısmi onay bilgilerini akıllı olarak önbelleğe almak için bir istek yaptığınızda, kritik yoldaki gecikmeyi entegrasyon kararı verin. Jeton sağlayıcıyı tekrar hazırlamak, daha az tekrar etmenin bir yoludur Bu da, kontrol edilemeyen bir sonraki entegrasyon kararını verecek ve daha güncel bilgiler isteyin.

Bütünlük jetonu sağlayıcıyı hazırlayabilirsiniz:

  • Uygulamanız başlatıldığında (ör. baştan başlatmada). Jeton sağlayıcı hazırlanıyor eşzamansız ve bu nedenle başlatma süresini etkilemez. Bu seçenekte Kısa bir süre sonra entegrasyon kararı talep etmeyi planlıyorsanız Kullanıcı oturum açtığında veya oyuncu oyuna katıldığında uygulama başlatılır.
  • Uygulamanız açıldığında (ör. hazır durumda başlatma sırasında). Ancak her uygulamanın örnek, bütünlük jetonunu dakikada en fazla 5 kez hazırlayabilir.
  • Jetonu önceden hazırlamak istediğinizde arka planda herhangi bir zamanda bir entegrasyon kararı isteğidir.

Bütünlük jetonu sağlayıcıyı hazırlamak için aşağıdakileri yapın:

  1. Aşağıdaki örneklerde gösterildiği gibi bir StandardIntegrityManager oluşturun.
  2. Google Cloud'u sağlayan bir PrepareIntegrityTokenRequest oluşturun proje numarasını setCloudProjectNumber() yöntemiyle ölçmeniz gerekir.
  3. Yöneticiyi kullanarak prepareIntegrityToken() numaralı telefonu arayarak PrepareIntegrityTokenRequest.
ziyaret edin.

Java

import com.google.android.gms.tasks.Task;

// Create an instance of a manager.
StandardIntegrityManager standardIntegrityManager =
    IntegrityManagerFactory.createStandard(applicationContext);

StandardIntegrityTokenProvider integrityTokenProvider;
long cloudProjectNumber = ...;

// Prepare integrity token. Can be called once in a while to keep internal
// state fresh.
standardIntegrityManager.prepareIntegrityToken(
    PrepareIntegrityTokenRequest.builder()
        .setCloudProjectNumber(cloudProjectNumber)
        .build())
    .addOnSuccessListener(tokenProvider -> {
        integrityTokenProvider = tokenProvider;
    })
    .addOnFailureListener(exception -> handleError(exception));

Üçlü

IEnumerator PrepareIntegrityTokenCoroutine() {
    long cloudProjectNumber = ...;

    // Create an instance of a standard integrity manager.
    var standardIntegrityManager = new StandardIntegrityManager();

    // Request the token provider.
    var integrityTokenProviderOperation =
      standardIntegrityManager.PrepareIntegrityToken(
        new PrepareIntegrityTokenRequest(cloudProjectNumber));

    // Wait for PlayAsyncOperation to complete.
    yield return integrityTokenProviderOperation;

    // Check the resulting error code.
    if (integrityTokenProviderOperation.Error != StandardIntegrityErrorCode.NoError)
    {
        AppendStatusLog("StandardIntegrityAsyncOperation failed with error: " +
                integrityTokenProviderOperation.Error);
        yield break;
    }

    // Get the response.
    var integrityTokenProvider = integrityTokenProviderOperation.GetResult();
}

Yerel

/// Initialize StandardIntegrityManager
StandardIntegrityManager_init(/* app's java vm */, /* an android context */);
/// Create a PrepareIntegrityTokenRequest opaque object.
int64_t cloudProjectNumber = ...;
PrepareIntegrityTokenRequest* tokenProviderRequest;
PrepareIntegrityTokenRequest_create(&tokenProviderRequest);
PrepareIntegrityTokenRequest_setCloudProjectNumber(tokenProviderRequest, cloudProjectNumber);

/// Prepare a StandardIntegrityTokenProvider opaque type pointer and call
/// StandardIntegrityManager_prepareIntegrityToken().
StandardIntegrityTokenProvider* tokenProvider;
StandardIntegrityErrorCode error_code =
        StandardIntegrityManager_prepareIntegrityToken(tokenProviderRequest, &tokenProvider);

/// ...
/// Proceed to polling iff error_code == STANDARD_INTEGRITY_NO_ERROR
if (error_code != STANDARD_INTEGRITY_NO_ERROR)
{
    /// Remember to call the *_destroy() functions.
    return;
}
/// ...
/// Use polling to wait for the async operation to complete.

IntegrityResponseStatus token_provider_status;

/// Check for error codes.
StandardIntegrityErrorCode error_code =
        StandardIntegrityTokenProvider_getStatus(tokenProvider, &token_provider_status);
if (error_code == STANDARD_INTEGRITY_NO_ERROR
    && token_provider_status == INTEGRITY_RESPONSE_COMPLETED)
{
    /// continue to request token from the token provider
}
/// ...
/// Remember to free up resources.
PrepareIntegrityTokenRequest_destroy(tokenProviderRequest);

İstekleri, izinsiz değişikliklere karşı koru (önerilir)

Uygulamanızda bir kullanıcı işlemini Play Integrity API ile kontrol ederken , zararlı saldırıları azaltmak için requestHash alanından yararlanabilir. Örneğin, Örneğin bir oyun, oyuncunun skorunu oyunun arka ucuna bildirmek isteyebilir varsa ve sunucunuz bu puanın Google tarafından olabilir. Play Integrity API, requestHash alanı, imzalı bütünlük yanıtının içindedir. Şu olmadan: requestHash, bütünlük jetonu yalnızca cihaza bağlı olur ancak söz konusu istekle ilişkilidir. Bu da saldırı olasılığını artırır. Aşağıdakiler talimatlarda requestHash alanının etkili şekilde nasıl kullanılacağı açıklanmaktadır:

Entegrasyon kararı istediğinizde:

  • İlgili tüm istek parametrelerinin (ör. kararlı bir istemcinin SHA256) özetini serileştirme isteği) gönderen kullanıcı işleminden veya sunucu isteğinden bahsedeceğim. requestHash alanında ayarlanan değerin maksimum uzunluğu: 500 bayt. requestHash için önemli olan tüm uygulama isteği verilerini ekleyin veya yaptığınız işlemle alakalı olması gerekir. İlgili içeriği oluşturmak için kullanılan requestHash alanı, bütünlük jetonunu tam olarak içine dahil ediliyor, dolayısıyla değerleri, istek boyutunu artırabilir.
  • Özeti Play Integrity API'ye requestHash alanı olarak sağlayın ve almak için bir fırsattır.
ziyaret edin.

Entegrasyon kararı aldığınızda:

  • Bütünlük jetonunun kodunu çözün ve requestHash alanını çıkarın.
  • İsteğin özetini uygulamada olduğu gibi (ör. SHA256'yı destekler).
  • Uygulama tarafı ve sunucu tarafı özetlerini karşılaştırın. Bunlar eşleşmezse bu istek güvenilir olmayabilir.
ziyaret edin.

Entegrasyon kararı isteme (isteğe bağlı)

Bütünlük jetonu sağlayıcıyı hazırladıktan sonra istemeye başlayabilirsiniz entegrasyon kararını geride bırakır. Bunun için aşağıdaki adımları uygulayın:

  1. Yukarıda gösterildiği gibi bir StandardIntegrityTokenProvider edinin.
  2. Şu istek karmasını sağlayarak bir StandardIntegrityTokenRequest oluşturun: setRequestHash yöntemiyle korumak istediğiniz kullanıcı işlemi.
  3. Bütünlük jetonu sağlayıcıyı kullanarak request() öğesini çağırarak StandardIntegrityTokenRequest.

Java

import com.google.android.gms.tasks.Task;

StandardIntegrityTokenProvider integrityTokenProvider;

// See above how to prepare integrityTokenProvider.

// Request integrity token by providing a user action request hash. Can be called
// several times for different user actions.
String requestHash = "2cp24z...";
Task<StandardIntegrityToken> integrityTokenResponse =
    integrityTokenProvider.request(
        StandardIntegrityTokenRequest.builder()
            .setRequestHash(requestHash)
            .build());
integrityTokenResponse
    .addOnSuccessListener(response -> sendToServer(response.token()))
    .addOnFailureListener(exception -> handleError(exception));

Üçlü

IEnumerator RequestIntegrityTokenCoroutine() {
    StandardIntegrityTokenProvider integrityTokenProvider;

    // See above how to prepare integrityTokenProvider.

    // Request integrity token by providing a user action request hash. Can be called
    // several times for different user actions.
    String requestHash = "2cp24z...";
    var integrityTokenOperation = integrityTokenProvider.Request(
      new StandardIntegrityTokenRequest(requestHash)
    );

    // Wait for PlayAsyncOperation to complete.
    yield return integrityTokenOperation;

    // Check the resulting error code.
    if (integrityTokenOperation.Error != StandardIntegrityErrorCode.NoError)
    {
        AppendStatusLog("StandardIntegrityAsyncOperation failed with error: " +
                integrityTokenOperation.Error);
        yield break;
    }

    // Get the response.
    var integrityToken = integrityTokenOperation.GetResult();
}

Yerel

/// Create a StandardIntegrityTokenRequest opaque object.
const char* requestHash = ...;
StandardIntegrityTokenRequest* tokenRequest;
StandardIntegrityTokenRequest_create(&tokenRequest);
StandardIntegrityTokenRequest_setRequestHash(tokenRequest, requestHash);

/// Prepare a StandardIntegrityToken opaque type pointer and call
/// StandardIntegrityTokenProvider_request(). Can be called several times for
/// different user actions. See above how to prepare token provider.
StandardIntegrityToken* token;
StandardIntegrityErrorCode error_code =
        StandardIntegrityTokenProvider_request(tokenProvider, tokenRequest, &token);

/// ...
/// Proceed to polling iff error_code == STANDARD_INTEGRITY_NO_ERROR
if (error_code != STANDARD_INTEGRITY_NO_ERROR)
{
    /// Remember to call the *_destroy() functions.
    return;
}
/// ...
/// Use polling to wait for the async operation to complete.

IntegrityResponseStatus token_status;

/// Check for error codes.
StandardIntegrityErrorCode error_code =
        StandardIntegrityToken_getStatus(token, &token_status);
if (error_code == STANDARD_INTEGRITY_NO_ERROR
    && token_status == INTEGRITY_RESPONSE_COMPLETED)
{
    const char* integrityToken = StandardIntegrityToken_getToken(token);
}
/// ...
/// Remember to free up resources.
StandardIntegrityTokenRequest_destroy(tokenRequest);
StandardIntegrityToken_destroy(token);
StandardIntegrityTokenProvider_destroy(tokenProvider);
StandardIntegrityManager_destroy();

Entegrasyon kararının şifresini çözün ve doğrulayın

Entegrasyon kararı istedikten sonra Play Integrity API şu bilgileri sağlar: şifrelenmiş yanıt jetonu. Cihaz entegrasyon kararlarını almak için şunları yapmanız gerekir: Google'ın sunucularında bütünlük jetonunun şifresini çözme. Bunun için aşağıdaki adımları uygulayın:

  1. Hizmet hesabı oluşturma bu verileri paylaşmıştık.
  2. Uygulamanızın sunucusunda hizmet hesabınızdan erişim jetonunu getirin Playintegrity kapsamını kullanarak kimlik bilgilerini sağlayın ve şu isteği gönderin:

    playintegrity.googleapis.com/v1/PACKAGE_NAME:decodeIntegrityToken -d \
    '{ "integrity_token": "INTEGRITY_TOKEN" }'
    .
  3. JSON yanıtını okuyun.

Elde edilen yük, bütünlük içeren bir düz metin jetonudur karar verebilirsiniz.

Otomatik tekrar oynatma koruması

Google Play, tekrar saldırı saldırılarını hafifletmek için her bir kullanıcının aşağıdakileri otomatik olarak sağlar. bütünlük jetonu birçok kez yeniden kullanılamaz. Şifrelerini tekrar tekrar çözmeye çalışmak aynı jeton boş kararlar verilmesine neden olur.