Usługa SafetyNet zawiera interfejs API reCAPTCHA, którego możesz używać do ochrony aplikacji przed złośliwym ruchem.
reCAPTCHA to bezpłatna usługa, która wykorzystuje zaawansowany mechanizm analizy ryzyka do ochrony aplikacji przed spamem i innymi działaniami naruszającymi zasady. Jeśli usługa podejrzewa, że użytkownik korzystający z aplikacji może być botem, wyświetla zabezpieczenie CAPTCHA, które musi rozwiązać człowiek, zanim aplikacja będzie mogła kontynuować działanie.
Z tego dokumentu dowiesz się, jak zintegrować interfejs reCAPTCHA API z SafetyNet ze swoją aplikacją.
Dodatkowe warunki korzystania z usługi
Uzyskując dostęp do interfejsu API reCAPTCHA lub z niego korzystając, akceptujesz Warunki korzystania z interfejsów API Google oraz poniższe Warunki korzystania z usługi reCAPTCHA. Zanim uzyskasz dostęp do interfejsów API, przeczytaj i zapoznaj się ze wszystkimi obowiązującymi warunkami oraz zasadami.
Warunki korzystania z usługi reCAPTCHA
Przyjmujesz do wiadomości, że interfejs API reCAPTCHA gromadzi informacje o sprzęcie i oprogramowaniu, takie jak dane o urządzeniu i aplikacjach oraz wyniki kontroli integralności, oraz wysyła je do Google w celu analizy. Zgodnie z artykułem 3(d) Warunków korzystania z interfejsów API Google potwierdzasz, że używając tych interfejsów API, bierzesz na siebie odpowiedzialność za przekazanie wszelkich niezbędnych powiadomień oraz uzyskanie zgód związanych z gromadzeniem tych danych i udostępnianiem ich firmie Google.Rejestrowanie pary kluczy reCAPTCHA
Aby zarejestrować parę kluczy do użycia z interfejsem API reCAPTCHA SafetyNet, otwórz stronę rejestracji reCAPTCHA na Androida, a potem wykonaj te czynności:
W wyświetlonym formularzu podaj te informacje:
- Etykieta: unikalna etykieta klucza. Zwykle jest to nazwa firmy lub organizacji.
- Typ reCAPTCHA: wybierz reCAPTCHA v2, a następnie reCAPTCHA na Androida.
- Pakiety: podaj nazwę pakietu każdej aplikacji, która używa tego klucza API. Aby aplikacja mogła korzystać z interfejsu API, wpisana nazwa pakietu musi dokładnie odpowiadać nazwie pakietu aplikacji. Każdą nazwę pakietu umieść w osobnym wierszu.
- Właściciele: dodaj adres e-mail każdej osoby w organizacji, która monitoruje oceny reCAPTCHA w aplikacji.
Zaznacz pole Zaakceptuj Warunki korzystania z usługi reCAPTCHA.
Wyślij alerty do właścicieli: zaznacz to pole wyboru, jeśli chcesz otrzymywać e-maile dotyczące interfejsu API reCAPTCHA, a potem kliknij Prześlij.
Na stronie, która się otworzy, klucze publiczny i prywatny pojawią się odpowiednio w polach Klucz witryny i Klucz tajny. Klucza witryny używasz, gdy wysyłasz żądanie weryfikacji, a klucza tajnego, gdy weryfikujesz token odpowiedzi użytkownika.
Dodaj zależność SafetyNet API
Zanim zaczniesz używać interfejsu reCAPTCHA API, dodaj interfejs SafetyNet API do projektu. Jeśli używasz Android Studio, dodaj tę zależność do pliku Gradle na poziomie aplikacji. Więcej informacji znajdziesz w artykule Konfigurowanie interfejsu SafetyNet API.
Korzystanie z interfejsu API reCAPTCHA
Z tej sekcji dowiesz się, jak wywołać interfejs API reCAPTCHA, aby wysłać żądanie weryfikacji CAPTCHA i otrzymać token odpowiedzi użytkownika.
Wysyłanie prośby o weryfikację
Aby wywołać interfejs API reCAPTCHA SafetyNet, wywołaj metodę verifyWithRecaptcha()
. Zwykle ta metoda odpowiada wyborowi przez użytkownika elementu interfejsu, np. przycisku, w Twojej aktywności.
Jeśli w aplikacji używasz metody verifyWithRecaptcha()
, musisz:
- Przekaż jako parametr klucz witryny interfejsu API.
- Zastąp metody
onSuccess()
ionFailure()
metodami, aby obsłużyć oba możliwe wyniki zadania dotyczącego żądania weryfikacji. Jeśli interfejs API przekazuje instancjęApiException
doonFailure()
, musisz obsłużyć wszystkie możliwe kody stanu, które możesz pobrać za pomocągetStatusCode()
.
Ten fragment kodu pokazuje, jak wywołać tę metodę:
Kotlin
fun onClick(view: View) { SafetyNet.getClient(this).verifyWithRecaptcha(YOUR_API_SITE_KEY) .addOnSuccessListener(this as Executor, OnSuccessListener { response -> // Indicates communication with reCAPTCHA service was // successful. val userResponseToken = response.tokenResult if (response.tokenResult?.isNotEmpty() == true) { // Validate the user response token using the // reCAPTCHA siteverify API. } }) .addOnFailureListener(this as Executor, OnFailureListener { e -> if (e is ApiException) { // An error occurred when communicating with the // reCAPTCHA service. Refer to the status code to // handle the error appropriately. Log.d(TAG, "Error: ${CommonStatusCodes.getStatusCodeString(e.statusCode)}") } else { // A different, unknown type of error occurred. Log.d(TAG, "Error: ${e.message}") } }) }
Java
public void onClick(View v) { SafetyNet.getClient(this).verifyWithRecaptcha(YOUR_API_SITE_KEY) .addOnSuccessListener((Executor) this, new OnSuccessListener<SafetyNetApi.RecaptchaTokenResponse>() { @Override public void onSuccess(SafetyNetApi.RecaptchaTokenResponse response) { // Indicates communication with reCAPTCHA service was // successful. String userResponseToken = response.getTokenResult(); if (!userResponseToken.isEmpty()) { // Validate the user response token using the // reCAPTCHA siteverify API. } } }) .addOnFailureListener((Executor) this, new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { if (e instanceof ApiException) { // An error occurred when communicating with the // reCAPTCHA service. Refer to the status code to // handle the error appropriately. ApiException apiException = (ApiException) e; int statusCode = apiException.getStatusCode(); Log.d(TAG, "Error: " + CommonStatusCodes .getStatusCodeString(statusCode)); } else { // A different, unknown type of error occurred. Log.d(TAG, "Error: " + e.getMessage()); } } }); }
Weryfikowanie tokenu odpowiedzi użytkownika
Gdy interfejs API reCAPTCHA wykona metodę onSuccess()
, użytkownik ukończy zadanie CAPTCHA. Ta metoda wskazuje jednak tylko, że użytkownik poprawnie rozwiązał CAPTCHA. Nadal musisz zweryfikować token odpowiedzi użytkownika na serwerze backendu.
Aby dowiedzieć się, jak zweryfikować token odpowiedzi użytkownika, przeczytaj artykuł Weryfikowanie odpowiedzi użytkownika.