Home / Android Nachrichten / Android Einbindung von Googles reCAPTCHA in Ihre App

Android Einbindung von Googles reCAPTCHA in Ihre App

Die reCaptcha-API von Google schützt Ihre Website / App vor böswilligem Datenverkehr. Möglicherweise wurde das reCaptcha auf Webseiten integriert. Sie können dasselbe auch in Ihre Android-Apps integrieren, indem Sie die API SafetyNet verwenden. Der Dienst ist kostenlos und zeigt ein zu lösendes Captcha an, wenn die Engine den Verdacht hat, dass die Benutzerinteraktion ein Bot statt ein Mensch ist.

In diesem Artikel erstellen wir ein einfaches Feedback-Formular und integrieren das Captcha, um dies zu vermeiden die Formularübermittlung durch Bots. Nicht nur die Formulare, Sie können das Captcha in jedes Modul in Ihrer App integrieren.

 Android-Recaptcha-Integration-Safetynet-API "width =" 720 "height =" 359 "class =" aligncenter size -full wp-image-41771 "srcset =" https://www.androidhive.info/wp-content/uploads/2018/03/android-recaptcha-integration-safetynet-api.png 720w, https: // www. androidhive.info/wp-content/uploads/2018/03/android-recaptcha-integration-safetynet-api-300x150.png 300w "sizes =" (max-width: 720px) 100vw, 720px "/> <noscript><img src= 1. Wie es funktioniert?

Das reCAPTCHA wird validiert, indem bestimmte Netzwerkanrufe zwischen Ihrer App, dem SafetyNet-Server und Ihrem Server getätigt werden.

  • Zuerst müssen Sie das SafetyNet-Schlüsselpaar durch Registrieren Ihrer App erhalten. Sie erhalten Site Key und Secret .
  • Site Key wird in die Android-App integriert und kann öffentlich sein. Secret sollte auf Ihrem Server gespeichert und nicht verfügbar gemacht werden.
  • Wenn reCaptcha aufgerufen wird, wird dem Benutzer bei Bedarf die Captcha-Abfrage angezeigt. In diesem Schritt kommuniziert es mit dem Captcha-Server und gibt Benutzerantwort-Token unter Verwendung des Site-Schlüssels zurück.
  • Sobald das Benutzerantwort-Token empfangen wurde, muss es noch überprüft werden auf dem Server mit geheimem Schlüssel.
  • Von der mobilen App wird das Benutzerantwort-Token an Ihren Server gesendet. Vom Server wird das Token zusammen mit Secret an den SafetyNet-Server gesendet. Sobald der SafetyNet-Server das Token validiert, benachrichtigt er Ihren Server über den Erfolgsstatus.
  • Schließlich benachrichtigt Ihr Server die mobile App über den Status von Captcha, dh Erfolg oder Misserfolg.
 android-safetynet-recaptcha-server-validation- flow "width =" 720 "height =" 625 "class =" aligncenter size-full wp-image-41777 "srcset =" https://www.androidhive.info/wp-content/uploads/2018/03/android- safetynet-recaptcha-server-validation-flow.png 720w, https://www.androidhive.info/wp-content/uploads/2018/03/android-safetynet-recaptcha-server-validation-flow-300x260.png 300w " Größen = "(max-width: 720px) 100vw, 720px" /> <noscript><img src= 2. Beziehen des SafetyNet-Site-Schlüssels und -Geheimnisses

Befolgen Sie die folgenden Schritte, um Ihren Site-Schlüssel und -Geheimnis zu erhalten.

  1. Zur reCaptcha-Registrierungsseite wechseln und Ihre App registrieren. Sie können Ihren App- oder Bildschirmnamen eingeben.
  2. Wählen Sie die Art der Neuaufnahme aus. Ich bevorzuge die Auswahl von reCaptcha Android .
  3. Geben Sie den Paketnamen Ihrer App ein . Sie können mehrere App-Paketnamen für denselben Schlüssel eingeben.
  4. Akzeptieren Sie die Nutzungsbedingungen und klicken Sie auf Registrieren. Sobald Sie registriert sind, können Sie Site Key und Secret zusammen mit dem Beispielcode auf dem Bildschirm sehen.

3. Neues Projekt erstellen

1 . Erstellen Sie ein neues Projekt in Android Studio aus Datei ⇒ Neues Projekt und wählen Sie Grundaktivität aus Vorlagen aus. Verwenden Sie beim Erstellen den Paketnamen, den Sie im reCAPTCHA-Dashboard registriert haben.

2 . Fügen Sie safetynet -abhängigkeit zu Ihrem build.gradle hinzu und erstellen Sie das Projekt neu. Ich füge auch Volley- und ButterKnife-Abhängigkeiten hinzu. Volley wird zum Senden eines HTTP-Aufrufs an unseren Server verwendet, um das Captcha-Token auf der Serverseite zu validieren.
















dependencies {
    Implementierung fileTree (dir: 'libs', include: ['*.jar'] 











)
    Implementierung 'com.android.support:appcompat-v7:26.1.0'

    // SafetyNet reCAPTCHA
    Implementierung 'com.google.android.gms: play-services-safetynet: 11.8.0'

    // Buttermesser
    Implementierung 'com.jakewharton: butterknife: 8.8.1'
    annotationProcessor 'com.jakewharton: butterknife-compiler: 8.8.1'

    // Volley
    Implementierung 'com.android.volley: volley: 1.1.0'
}

3 . Fügen Sie die folgenden Ressourcen zu den entsprechenden Dateien colors.xml strings.xml und dimens.xml hinzu.



 # 00bbd3 
 # 0097a7 
 # FF4081 


 reCAPTCHA 
 Feedback 
 Geben Sie hier Ihr Feedback ein! 
 Feedback senden 
 Senden Sie uns Feedback! 
 Haben Sie einen Vorschlag? Füllen Sie das folgende Formular aus und wir werden es uns ansehen! 
 Vielen Dank für Ihr Feedback. Wir werden uns bald bei Ihnen melden! 


 16dp 

4 . Öffnen Sie die Layoutdatei Ihrer Hauptaktivität ( activity_main.xml und content_main.xml ) und fügen Sie das folgende Muster-Feedback-Formular hinzu.











    






        








    



    
















    







        









        






        










        






5 . Erstellen Sie eine neue Klasse mit dem Namen MyApplication.java und erweitern Sie die Klasse von Application . In dieser Klasse werden Volley-Singleton-Instanzen erstellt.








































 import android.app.Application;
import android.text.TextUtils;

importieren com.android.volley.Request;
import com.android.volley.RequestQueue;
importieren com.android.volley.toolbox.Volley;

/ **
 * Erstellt von ravi am 13.03.18.
 * /

öffentliche Klasse MyApplication erweitert Application {

    public static final String TAG = MyApplication.class
            .getSimpleName ();

    private RequestQueue mRequestQueue;

    private statische MyApplication-Instanz;

    @Override
    public void onCreate () {
        super.onCreate ();
        mInstance = this;
    }

    öffentliche statische synchronisierte MyApplication getInstance () {
        return mInstance;
    }

    public RequestQueue getRequestQueue () {
        if (mRequestQueue == null) {
            mRequestQueue = Volley.newRequestQueue (getApplicationContext ());
        }

        return mRequestQueue;
    }

    public  void addToRequestQueue (Request 





 req, String tag) {
        // Setzt das Standard-Tag, wenn das Tag leer ist
        req.setTag (TextUtils.isEmpty (tag)? TAG: tag);
        getRequestQueue (). add (req);
    }

    public  void addToRequestQueue (Request 










 req) {
        req.setTag (TAG);
        getRequestQueue (). add (req);
    }

    public void cancelPendingRequests (Object-Tag) {
        if (mRequestQueue! = null) {
            mRequestQueue.cancelAll (tag);
        }
    }
}

6 . Öffnen Sie AndroidManifest.xml und fügen Sie MyApplication zum -Tag hinzu. Wir müssen auch die Berechtigung INTERNET hinzufügen.







    



    


    


7 . Öffnen Sie schließlich MainActivity.java und führen Sie die folgenden Änderungen durch.

  • Ersetzen Sie den Wert SAFETY_NET_API_SITE_KEY durch Ihren eigenen SafetyNet -Siteschlüssel
  • . URL_VERIFY_ON_SERVER Wert mit Ihrer eigenen Server-URL. Diese URL überprüft den Captcha-Schlüssel für info.androidhive.recaptcha nur, da er das Secret für dieses Paket enthält.
  • https://api.androidhive.info/google-recaptcha-verfication.php ] ist die URL meines Servers, funktioniert nur für diese App. In Kürze wird der Code dieses Endpunkts angezeigt.
  • validateCaptcha () zeigt das Dialogfeld "Captcha" an und ruft das Benutzerantwort-Token ab, das zur Validierung an Ihren Server gesendet werden muss.
  • verifyTokenOnServer () Die Methode sendet das empfangene Benutzerantwort-Token an den Server, um es mit dem Secret zu validieren. Der Server sendet eine POST-Anforderung an https://www.google.com/recaptcha/api/siteverify und überprüft das Token.
  • Sobald das Token auf dem Server überprüft wurde, antwortet Ihr Server mit JSON Erfolgsstatus. Sie müssen je nach Erfolgsstatus weitere Maßnahmen ergreifen. In diesem Fall muss das Feedback übermittelt werden.

















































































 package info.androidhive.recaptcha;

android.os.Bundle importieren;
import android.support.annotation.NonNull;
android.support.v7.app.AppCompatActivity importieren;
import android.support.v7.widget.Toolbar;
import android.text.TextUtils;
import android.util.Log;
android.view.View importieren;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;
android.widget.Toast importieren;

importieren com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
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.JSONException;
import org.json.JSONObject;

import java.util.HashMap;
import java.util.Map;

import butterknife.BindView;
Buttermesser importieren.ButterKnife;
import butterknife.OnClick;

public class MainActivity erweitert AppCompatActivity {

    private static final String TAG = MainActivity.class.getSimpleName ();

    // TODO - Ersetzen Sie den SITE KEY durch Ihren
    private static final String SAFETY_NET_API_SITE_KEY = "6Lf8z0sUAAAAAP80KqD1U-3e7M_JlOrgWSms5XDd";

    // TODO - Ersetzen Sie die SERVER-URL durch Ihre
    private static final String URL_VERIFY_ON_SERVER = "https://api.androidhive.info/google-recaptcha-verfication.php";

    @BindView (R.id.input_feedback)
    EditText inputFeedback;

    @BindView (R.id.layout_feedback_form)
    LinearLayout layoutFeedbackForm;

    @BindView (R.id.message_feedback_done)
    TextView messageFeedbackDone;

    @Override
    protected void onCreate (Bundle savedInstanceState) {
        super.onCreate (savedInstanceState);
        setContentView (R.layout.activity_main);
        ButterKnife.bind (this);

        Toolbar toolbar = findViewById (R.id.toolbar);
        setSupportActionBar (Symbolleiste);
        getSupportActionBar (). setTitle (getString (R.string.feedback));
        getSupportActionBar (). setDisplayHomeAsUpEnabled (true);

        Toast.makeText (getApplicationContext (), "Android Studio` LogCat` immer auf Fehler prüfen! ", Toast.LENGTH_LONG) .show ();
    }

    @OnClick (R.id.btn_send)
    public void validateCaptcha () {

        String feedback = inputFeedback.getText (). ToString (). Trim ();
        // auf leere Rückmeldung prüfen
        if (TextUtils.isEmpty (feedback)) {
            Toast.makeText (getApplicationContext (), "Feedback eingeben!", Toast.LENGTH_LONG) .show ();
            Rückkehr;
        }

        // reCAPTCHA-Dialog anzeigen
        SafetyNet.getClient (this) .verifyWithRecaptcha (SAFETY_NET_API_SITE_KEY)
                .addOnSuccessListener (dieser neue OnSuccessListener 





































 () {
                    @Override
                    public void onSuccess (SafetyNetApi.RecaptchaTokenResponse-Antwort) {
                        Log.d (TAG, "onSuccess");

                        if (! response.getTokenResult (). isEmpty ()) {

                            // Captcha-Token empfangen
                            // Dieses Token muss noch auf dem Server validiert werden
                            // mit der SECRET-Taste
                            verifyTokenOnServer (response.getTokenResult ());
                        }
                    }
                })
                .addOnFailureListener (dies, neuer OnFailureListener () {
                    @Override
                    public void onFailure (@NonNull Exception e) {
                        if (e instanceof ApiException) {
                            ApiException apiException = (ApiException) e;
                            Log.d (TAG, "Fehlermeldung:" +
                                    CommonStatusCodes.getStatusCodeString (apiException.getStatusCode ()));
                        } else {
                            Log.d (TAG, "Unbekannter Fehlertyp:" + e.getMessage ());
                        }
                    }
                });
    }

    / **
     * Überprüfen des Captcha-Tokens auf dem Server
     * Post param: Neuaufnahme-Antwort
     * Der Server ruft https://www.google.com/recaptcha/api/siteverify an
     * mit SECRET Key und Captcha Token
     * /
    public void verifyTokenOnServer (endgültiges Zeichenfolgetoken) {
        Log.d (TAG, "Captcha Token" + Token);

        StringRequest strReq = new StringRequest (Request.Method.POST,
                URL_VERIFY_ON_SERVER, neuer Response.Listener 
































 () {

            @Override
            public void onResponse (String response) {
                Log.d (TAG, response.toString ());

                Versuchen {
                    JSONObject jsonObject = neues JSONObject (Antwort);
                    Boolescher Erfolg = jsonObject.getBoolean ("Erfolg");
                    String message = jsonObject.getString ("message");

                    if (Erfolg) {
                        // Glückwunsch! Captcha erfolgreich auf dem Server verifiziert
                        // TODO - Sende das Feedback an deinen Server

                        layoutFeedbackForm.setVisibility (View.GONE);
                        messageFeedbackDone.setVisibility (View.VISIBLE);
                    } else {
                        Toast.makeText (getApplicationContext (), message, Toast.LENGTH_LONG) .show ();
                    }
                } catch (JSONException e) {
                    e.printStackTrace ();
                    Toast.makeText (getApplicationContext (), "Json Error:" + e.getMessage (), Toast.LENGTH_LONG) .show ();
                }

            }
        }, neuer Response.ErrorListener () {
            @Override
            public void onErrorResponse (VolleyError-Fehler) {
                Log.e (TAG, "Error:" + error.getMessage ());
            }
        }) {
            @Override
            geschützte Map 
 getParams () {
                Map 









 params = new HashMap <> ();
                params.put ("Neuaufnahme-Antwort", Token);

                Rückkehr params;
            }
        };

        MyApplication.getInstance (). AddToRequestQueue (strReq);
    }
}

Führen Sie die App aus und testen Sie sie einmal. Wenn die App nicht funktioniert, stellen Sie sicher, dass Sie den richtigen Paketnamen, das richtige Schlüsselpaar und den richtigen Serverendpunkt verwenden.

 android-integrierende-google-recaptcha-form "width =" 720 "height =" 647 "class =" aligncenter size -full wp-image-41775 "srcset =" https://www.androidhive.info/wp-content/uploads/2018/03/android-integrating-google-recaptcha-form.png 720w, https: // www. androidhive.info/wp-content/uploads/2018/03/android-integrating-google-recaptcha-form-300x270.png 300w "sizes =" (maximale Breite: 720px) 100vw, 720px "/> <noscript><img src= "https://www.google.com/recaptcha/api/siteverify",     CURLOPT_POST => true,     CURLOPT_POSTFIELDS => [         'secret' => $ secretKey,         'response' => $ captcha,         'remoteip' => $ _SERVER ['REMOTE_ADDR']     ],     CURLOPT_RETURNTRANSFER => true ]); $ output = curl_exec ($ ch); curl_close ($ ch); $ json = json_decode ($ output); $ res = array (); if ($ json-> success) { $ res ['success'] = true; $ res ['message'] = 'Captcha erfolgreich verifiziert!'; }sonst{ $ res ['success'] = false; $ res ['message'] = 'Captcha konnte nicht verifiziert werden!'; } echo json_encode ($ res); ?>

Wenn Sie noch Vorschläge oder Fragen haben, kommentieren Sie diese bitte weiter unten.

Einen schönen Tag noch 🙂

Hallo! Ich bin Gründer bei androidhive und Programmierer. Meine Fähigkeiten umfassen Android, iOS, PHP, Ruby on Rails und vieles mehr. Wenn Sie eine Idee haben, die ich entwickeln soll? Reden wir: ravi@androidhive.info



About AndroidWeltEditor

Check Also

Best Smart Thermostat for Multiple Zones 2021

Source: Ecobee Best Smart Thermostat for Multiple Zones Android Central 2021 For large homes or …

Leave a Reply

Your email address will not be published. Required fields are marked *