Dodawanie weryfikacji licencji po stronie serwera do aplikacji

Gdy sprawdzasz, czy użytkownik kupił lub pobrał autentyczną kopię aplikacji ze Sklepu Google Play, najlepiej jest przeprowadzić weryfikację licencji na serwerze, który kontrolujesz.

Niniejszy przewodnik przedstawia krok po kroku proces weryfikacji licencji po stronie serwera oraz kilka sprawdzonych metod związanych z przeprowadzaniem tego sprawdzenia.

Omówienie procesu

Rysunek 1 przedstawia sposób przesyłania informacji między aplikacją, Google Play i Twoim prywatnym serwerem:

Diagram przepływu danych
Rysunek 1. Przepływ danych między Twoją aplikacją a Google Play, a następnie między Twoją aplikacją a Twoim prywatnym serwerem.
  1. Aplikacja wysyła do Google Play żądanie z pytaniem, czy dany użytkownik kupił lub pobrał prawidłową kopię aplikacji.
  2. W odpowiedzi Google Play wysyła do aplikacji obiekt danych odpowiedzi, czyli obiekt typu ResponseData. Obiekt jest podpisanym komunikatem informującym, czy użytkownik kupił lub pobrał wiarygodną kopię aplikacji.
  3. Aplikacja wysyła żądanie do prywatnego serwera, który kontrolujesz, weryfikując zawartość danych odpowiedzi.
  4. W odpowiedzi serwer wysyła do aplikacji stan informujący o tym, czy użytkownik rzeczywiście ją kupił lub pobrał autentyczną kopię aplikacji. Jeśli serwer wyświetli komunikat o „sukcesie”, potwierdź tę odpowiedź, a następnie przyznaj użytkownikowi dostęp do zasobów, które wymagają licencji.

Dane odpowiedzi są podpisywane przez Google Play, a następnie sprawdzane na serwerze, dlatego nie można zmodyfikować obiektu na urządzeniu, na którym jest uruchomiona aplikacja. Jeśli aplikacja działa na serwerze i udostępnia zasoby tylko uprawnionym użytkownikom, jest ona znacznie lepiej chroniona przed nieautoryzowanymi użytkownikami.

W poniższych sekcjach znajdziesz dodatkowe kwestie, o których należy pamiętać podczas weryfikowania licencji po stronie serwera.

Ochrona przed atakami typu replay

Po otrzymaniu odpowiedzi z Google Play dotyczącej stanu licencji użytkownika użytkownik może skopiować dane odpowiedzi i wykorzystać je wielokrotnie lub przekazać je innym użytkownikom, którzy będą mogli wysyłać własne żądania do prywatnego serwera Twojej aplikacji. Nazywamy to atakem powtórnym.

Aby zmniejszyć prawdopodobieństwo, że użytkownicy będą powtarzać atak, przed wysłaniem żądania na serwer aplikacji wykonaj te czynności:

  • Sprawdź sygnaturę czasową znajdującą się w danych odpowiedzi, upewniając się, że odpowiedź została ostatnio wygenerowana przez Google Play.

  • Ogranicz szybkość przesyłania żądań serwera, np. przez wykładnicze ponawianie, aby ograniczyć liczbę prób wysłania tych samych danych odpowiedzi na serwer aplikacji.

  • Zanim sprawdzisz na serwerze prywatnym zawartość danych odpowiedzi Google Play, wyślij do swojego prywatnego serwera wstępne żądanie oparte na uwierzytelnianie. W pierwszym żądaniu wyślij dane logowania użytkownika na swój serwer, po czym serwer powinien odpowiedzieć przy użyciu nonce lub liczby używanej tylko raz. Możesz ją później uwzględnić w następnym żądaniu wysyłanym do serwera prywatnego, prosząc o dane weryfikacyjne licencji. Szczegółowe informacje o wybieraniu dobrej wartości dla jednorazowej wartości znajdziesz w sekcji Generowanie odpowiedniej wartości jednorazowej.

Wygeneruj odpowiednią wartość jednorazową

Aby utworzyć trudną do odgadnięcia wartość jednorazową, użyj jednej z tych metod:

  • Wygeneruj wartość skrótu na podstawie identyfikatora użytkownika.
  • Wygeneruj losową wartość dla poszczególnych użytkowników. Zapisz tę losową wartość na serwerze aplikacji jako część atrybutów danego użytkownika.

Zweryfikuj dane odpowiedzi z serwera

Podczas sprawdzania danych odpowiedzi wysyłanych przez serwer aplikacji do aplikacji upewnij się, że odpowiedź z biblioteki weryfikacji licencji nie jest sfałszowana. Sprawdź podpis zawarty w danych odpowiedzi serwera aplikacji, porównując go z kluczem otrzymanym przez aplikację z Google Play w poprzednim kroku.

Warto też pamiętać, że jedyna podpisana część to blok odpowiedni dla biblioteki weryfikacji licencji (LVL). Jest to jedyna część danych odpowiedzi serwera aplikacji, której aplikacja powinna ufać.