Использование Google reCAPTCHA в приложении для Android

Рассмотрим процесс интеграции Google reCaptcha в наше приложение для Android. Google reCaptcha защищает наше приложение от вредоносного трафика. Это реализуется с использованием API SafetyNet.

Как добавить Google reCaptcha в приложение на андроид

Google reCAPTCHA проверяется путем сетевых вызовов между приложением Android, сервером SafetyNet и вашим сервером:

  • Android-приложение отправляет запрос с Site Key на сервер SafetyNet для проверки reCAPTCHA.
  • Сервер SafetyNet формирует ответ токеном капчи приложению Android, используя ключ сайта.
  • Токен капчи отправляется на ваш сервер для проверки с помощью секретного ключа.
  • Ваш сервер Android отправляет запрос в SafetyNet для проверки токена капчи с помощью секретного ключа.
  • SafetyNet проверяет ответ маркера и возвращает результат как успешный или неудачный.
  • Ваш сервер Android уведомляет приложение Android, проверяя токен, и возвращает результат как успешный или неудачный.

Работа Google reCAPTCHA в Android-приложении

Генерация ключа сайта reCAPTCHA и секретного ключа

Перед созданием ключей API внимательно прочитайте условия использования API https://developers.google.com/terms/.

Регистрация в recaptcha

  • Укажите входные данные метки, имени пакета и примите условия и Сервис reCAPTCHA.Метка: это уникальная метка для вашего ключа. Вы можете использовать название вашей компании или организации.Имя пакета: это имя пакета вашего приложения для Android.

Регистрация нового сайта

  • Ключ сайта, секретный ключ, код интеграции на стороне клиента и код на стороне сервера создаются на следующей странице.

Создание ключей

Пример Android интеграции Google reCAPTCHA

Давайте создадим пример интеграции Google reCAPTCHA в наше приложение для Android.

build.gradle

Добавьте следующие зависимости SafetyNet и Volley в файл build.gradle.

 
dependencies { 
    implementation 'com.google.android.gms:play-services-safetynet:15.0.1' 
    implementation 'com.android.volley:volley:1.0.0' 
} 

AndroidManifest.xml

Добавьте разрешение на доступ в Интернет в файле AndroidManifest.xml.

 
<uses-permission android:name="android.permission.INTERNET" />

Activity_main.xml

Добавьте следующий код в файл activity_main.xml.

<?xml version="1.0" encoding="utf-8"?>  
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    xmlns:app="http://schemas.android.com/apk/res-auto"  
    xmlns:tools="http://schemas.android.com/tools"  
    android:layout_width="match_parent"  
    android:layout_height="match_parent"  
    tools:context="example.javatpoint.com.googlerecaptcha.MainActivity">  
  
    <TextView  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:layout_marginBottom="8dp"  
        android:layout_marginEnd="8dp"  
        android:layout_marginStart="8dp"  
        android:layout_marginTop="8dp"  
        android:text="Google Recaptcha"  
        android:textAppearance="@style/Base.TextAppearance.AppCompat.Large"  
        app:layout_constraintBottom_toBottomOf="parent"  
        app:layout_constraintEnd_toEndOf="parent"  
        app:layout_constraintHorizontal_bias="0.436"  
        app:layout_constraintLeft_toLeftOf="parent"  
        app:layout_constraintRight_toRightOf="parent"  
        app:layout_constraintStart_toStartOf="parent"  
        app:layout_constraintTop_toTopOf="parent"  
        app:layout_constraintVertical_bias="0.017" />  
  
    <Button  
        android:id="@+id/button"  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:layout_marginBottom="52dp"  
        android:layout_marginEnd="8dp"  
        android:layout_marginStart="8dp"  
        android:text="Verify captcha"  
        app:layout_constraintBottom_toBottomOf="parent"  
        app:layout_constraintEnd_toEndOf="parent"  
        app:layout_constraintStart_toStartOf="parent" />  
  
</android.support.constraint.ConstraintLayout>

MainActivity.java

Добавьте следующий код в файл класса MainActivity.java. В этом классе мы делаем интеграцию на стороне клиента с сервером SafetyNet и получаем ответ в виде строки JSON.

Замените значение SITE_KEY и SECRET_KEY вашим фактическим ключом сайта и секретным ключом. При нажатии на кнопку вызывается метод SafetyNet.getClient() для получения ключа сайта, и в случае успешного завершения вызывается handleSiteVerify() для проверки токена.

Библиотека Volley используется для следующих целей:

  • Библиотека RequestQueue of Volley поддерживает вызовы сервера в очереди.
  • StringRequest используется для получения ответа в виде строки JSON с вашего сервера.
  • Метод setRetryPolicy() повторяет вызов сервера в случае сбоя в течение установленного времени.
 
package example.javatpoint.com.googlerecaptcha; 
 
import android.support.annotation.NonNull; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.Button; 
import android.widget.Toast; 
import com.android.volley.DefaultRetryPolicy; 
import com.android.volley.Request; 
import com.android.volley.RequestQueue; 
import com.android.volley.Response; 
import com.android.volley.VolleyError; 
import com.android.volley.toolbox.StringRequest; 
import com.android.volley.toolbox.Volley; 
import com.google.android.gms.common.api.ApiException; 
import com.google.android.gms.common.api.CommonStatusCodes; 
import com.google.android.gms.safetynet.SafetyNet; 
import com.google.android.gms.safetynet.SafetyNetApi; 
import com.google.android.gms.tasks.OnFailureListener; 
import com.google.android.gms.tasks.OnSuccessListener; 
import org.json.JSONObject; 
import java.util.HashMap; 
import java.util.Map; 
 
public class MainActivity extends AppCompatActivity implements View.OnClickListener{ 
 
    String TAG = MainActivity.class.getSimpleName(); 
    Button btnverifyCaptcha; 
    String SITE_KEY = "6LeaN24UAxxxxx_YOUR_SITE_KEY"; 
    String SECRET_KEY = "6LeaN24UAxxxxx_YOUR_SECRET_KEY"; 
    RequestQueue queue; 
 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.activity_main); 
        btnverifyCaptcha = findViewById(R.id.button); 
        btnverifyCaptcha.setOnClickListener(this); 
 
        queue = Volley.newRequestQueue(getApplicationContext()); 
    } 
 
    @Override 
    public void onClick(View view) { 
        SafetyNet.getClient(this).verifyWithRecaptcha(SITE_KEY) 
                .addOnSuccessListener(this, new OnSuccessListener() { 
                    @Override 
                    public void onSuccess(SafetyNetApi.RecaptchaTokenResponse response) { 
                        if(!response.getTokenResult().isEmpty()) { 
                            handleSiteVerify(response.getTokenResult()); 
                        } 
                    } 
                }) 
                .addOnFailureListener(this, new OnFailureListener() { 
                    @Override 
                    public void onFailure(@NonNull Exception e) { 
                        if(e instanceof ApiException) { 
                            ApiException apiException =(ApiException) e; 
                            Log.d(TAG, "Error message: " + 
                                    CommonStatusCodes.getStatusCodeString(apiException.getStatusCode())); 
                        } else { 
                            Log.d(TAG, "Unknown type of error: " + e.getMessage()); 
                        } 
                    } 
                }); 
 
    } 
    protected  void handleSiteVerify(final String responseToken){ 
        //it is google recaptcha siteverify server 
        //you can place your server url 
        String url = "https://www.google.com/recaptcha/api/siteverify"; 
        StringRequest request = new StringRequest(Request.Method.POST, url, 
                new Response.Listener() { 
                    @Override 
                    public void onResponse(String response) { 
                        try { 
                            JSONObject jsonObject = new JSONObject(response); 
                            if(jsonObject.getBoolean("success")){ 
                                //code logic when captcha returns true Toast.makeText(getApplicationContext(),String.valueOf(jsonObject.getBoolean("success")),Toast.LENGTH_LONG).show(); 
                            } 
                            else{ 
                                Toast.makeText(getApplicationContext(),String.valueOf(jsonObject.getString("error-codes")),Toast.LENGTH_LONG).show(); 
                            } 
                        } catch(Exception ex) { 
                            Log.d(TAG, "JSON exception: " + ex.getMessage()); 
 
                        } 
                    } 
                }, 
                new Response.ErrorListener() { 
                    @Override 
                    public void onErrorResponse(VolleyError error) { 
                        Log.d(TAG, "Error message: " + error.getMessage()); 
                    } 
                }) { 
            @Override 
            protected Map getParams() { 
                Map params = new HashMap(); 
                params.put("secret", SECRET_KEY); 
                params.put("response", responseToken); 
                return params; 
            } 
        }; 
        request.setRetryPolicy(new DefaultRetryPolicy( 
                50000, 
                DefaultRetryPolicy.DEFAULT_MAX_RETRIES, 
                DefaultRetryPolicy.DEFAULT_BACKOFF_MULT)); 
        queue.add(request); 
    } 
} 

Вывод:

вывод в приложении андроид
Проверка

Использование reCAPTCHA
Вывод

Оцените статью