Wenn Sie eine Android-Anwendung entwickeln, die mit Ihrem Back-End-Server interagieren muss, ist es wichtig, dass Sie Maßnahmen gegen Bots-automatisierte Skripts ergreifen, die für den Menschen geeignet sind. Andernfalls hat Ihr Server eine sehr gute Chance, von ihnen überrannt zu werden.
CAPTCHAs, kurz für vollständig automatisierte Public Turing-Tests, um Computer und Menschen voneinander zu unterscheiden, sind derzeit die effektivste Verteidigung gegen Bots. Wie Sie vielleicht bereits wissen, handelt es sich in der Regel um Image-, Sprach- oder Common-Sense-Tests, die für Menschen einfach sind, für Computer jedoch extrem schwer.
In diesem Tutorial zeige ich Ihnen, wie Sie die neu veröffentlichte API von SafetyNet reCAPTCHA verwenden, um Ihren Android-Apps CAPTCHAs hinzuzufügen.
Um diesem Tutorial folgen zu können, benötigen Sie Folgendes:
Starten Sie Android Studio und erstellen Sie ein neues Projekt mit einer leeren Aktivität. In dem Konfigurieren Sie Ihr neues Projekt Stellen Sie sicher, dass Sie einen aussagekräftigen Paketnamen eingeben. Sie werden ihn verwenden, während Sie Ihre App beim reCAPTCHA-Dienst registrieren.
Überprüfen Sie zusätzlich die Kotlin-Support einbeziehen Feld. Da Kotlin jetzt eine offizielle Android-Sprache ist, verwenden wir sie in diesem Lernprogramm anstelle von Java.
SafetyNet-APIs sind Teil der Google Play-Dienste. Um sie in Ihrem Projekt verwenden zu können, fügen Sie Folgendes hinzu Implementierung
Abhängigkeit von der build.gradle Datei der App
Modul:
Implementierung "com.google.android.gms: play-services-safetynet: 11.0.2"
Um netzwerkbezogene Vorgänge durchzuführen, verwenden wir außerdem die Fuel-Bibliothek, die über eine sehr kurze, auf Kotlin basierende API verfügt. Fügen Sie es daher als ein anderes hinzu Implementierung
Abhängigkeit.
Implementierung 'com.github.kittinunf.fuel: fuel-android: 1.8.0'
Sie können keine netzwerkbezogenen Vorgänge ohne ausführen INTERNET
Wenn Sie die Berechtigung haben, fügen Sie der Manifest-Datei Ihres Projekts die folgende Zeile hinzu:
Zum Schluss drücken Sie die Jetzt synchronisieren Schaltfläche, um die Projektkonfiguration abzuschließen.
Sie benötigen zwei Schlüssel, bevor Sie den reCAPTCHA-Dienst verwenden können:
Um die Schlüssel zu erhalten, verwenden Sie Ihr Google-Konto und melden Sie sich an der reCAPTCHA-Administrationskonsole an. Wenn Sie die Konsole zum ersten Mal öffnen, wird automatisch ein kurzes Registrierungsformular angezeigt, in das Sie den Paketnamen Ihrer App eingeben können.
Nachdem Sie die Nutzungsbedingungen von reCAPTCHA akzeptiert haben, drücken Sie die Taste Registrieren Taste, um beide Schlüssel zu erzeugen.
Sie können jetzt den Site-Schlüssel zu Ihrem Android Studio-Projekt hinzufügen, indem Sie ihn einfach in der res / values / strings.xml Datei:
ABCDEFGHIJKLMNOPQ1234567890
Wir werden erst gegen Ende dieses Tutorials mit dem geheimen Schlüssel arbeiten. Notieren Sie ihn also an einem sicheren Ort.
Wenn wir das Wort CAPTCHA hören, denken wir normalerweise an unordentliche Bilder, die schwer lesbare Buchstaben und Zahlen enthalten. Solche CAPTCHAs sind jedoch dank der Fortschritte in der Computer Vision-Technologie nicht mehr gut genug, um alle Bots zu stoppen.
Vom reCAPTCHA-Dienst erzeugte CAPTCHAs sind sehr fortschrittlich und auch sehr interaktiv. In der Tat ähnelt das Lösen von ihnen dem Spielen von einfachen Spielen. Daher können Sie sie nicht direkt in das Layout Ihrer Aktivität einbetten. Stattdessen müssen Sie dem Layout eine Schaltfläche hinzufügen, durch die der Benutzer zu einem neuen Bildschirm oder Dialogfeld mit den CAPTCHAs gelangen sollte.
Der folgende Code zeigt, wie Sie a hinzufügen Taste
Widget zur Layout-XML-Datei Ihrer Aktivität:
Bevor Sie mit der Erstellung von CAPTCHAs beginnen, müssen Sie einen Client für die SafetyNet-API initialisieren. Sie können dies tun, indem Sie die getClient ()
Methode der Sicherheitsnetz
Klasse. Fügen Sie daher den folgenden Code in der onCreate ()
Methode Ihrer Aktivität
Klasse:
val myClient: SafetyNetClient = SafetyNet.getClient (dies)
Die CAPTCHAs müssen angezeigt werden, wenn der Benutzer auf die Schaltfläche drückt. Fügen Sie dem Ereignis eine Ereignisbehandlungsroutine mit einem Klick hinzu setOnClickListener ()
Methode. Im Handler rufen Sie einfach die verifyWithRecaptcha ()
Methode und übergeben Sie Ihren Site-Schlüssel als Argument, um ein Dialogfeld zu öffnen, das ein CAPTCHA enthält.
Der Rückgabewert von verifyWithRecaptcha ()
Methode ist a Aufgabe
Objekt. Durch das Anhängen eines erfolgreichen Event-Handlers können Sie eine RecaptchaTokenResponse
Objekt, das ein Token enthält, mit dem Sie feststellen können, ob der Benutzer den CAPTCHA bestanden hat oder nicht. Hier ist wie:
are_you_human_button.setOnClickListener meinClient .verifyWithRecaptcha (resources.getString (R.string.my_site_key)) .addOnSuccessListener successEvent -> val token: String = successEvent.tokenResult // mehr Code hier
Das im vorherigen Schritt erhaltene Token muss erneut an den reCAPTCHA-Dienst übergeben werden, um zu prüfen, ob der Benutzer den Test bestanden hat oder nicht. Diesmal muss der Aufruf des reCAPTCHA-Dienstes jedoch von Ihrem Back-End-Server erfolgen.
Der Server verfügt natürlich nicht über das Token, es sei denn, Ihre Android-App sendet es an den Server. Daher müssen wir jetzt Code schreiben, um Token von der Android-App an den Server zu senden.
Nehmen wir an, dass auf unserem Server ein Endpunkt aufgerufen wird bestätigen
, die das Token als Abfragezeichenfolgeparameter akzeptieren kann. Ich werde verwenden 10.0.2.2 als IP-Adresse des Servers und 8000 wie sein Hafen. Wenn Sie den Server auf Ihrem eigenen Computer und die App auf einem Emulator ausführen, der auf demselben Computer ausgeführt wird, können Sie auch dieselbe IP-Adresse verwenden.
val serverURL: String = "http://10.0.2.2:8000/validate"
Sie können jetzt die anrufen httpGet ()
Von der Fuel-Bibliothek angebotene Methode, um das Token an den Server zu senden. Die Methode erwartet eine Liste von Abfragezeichenfolgeparametern als einziges Argument. Ich schlage daher vor, dass Sie die Liste von()
Dienstprogrammmethode zum Erstellen einer Liste, die ein einzelnes Element enthält: das Token, das einem benannten Abfrageparameter zugewiesen ist user_token
.
Weil der httpGet ()
Methode asynchron läuft, müssen Sie das aufrufen responseString ()
Methode, um den Rückgabewert zu verarbeiten. Der folgende Code zeigt Ihnen wie:
serverURL.httpGet (listOf ("user_token" zum Token)) .responseString Anfrage, Antwort, Ergebnis -> // mehr Code hier
Sie können sehen, dass wir jetzt Zugriff auf eine haben Ergebnis
Objekt. Falls keine Fehler auftreten, enthält es die Antwort unseres Servers als Zeichenfolge.
Nehmen wir an, dass unser Server die Zeichenfolge "PASS" zurückgibt, wenn der Benutzer den Test besteht, andernfalls "FAIL". Was Sie tatsächlich tun, wenn der Benutzer den Test besteht oder nicht, liegt natürlich bei Ihnen. Für den Moment schlage ich vor, dass Sie die entsprechende Anzeige einfach anzeigen Toast
Mitteilungen. Der folgende Code zeigt Ihnen, wie Sie dies kurz und bündig machen:
result.fold (data -> if (data.contains ("PASS")) Toast.makeText (baseContext, "Sie scheinen ein Mensch zu sein.", Toast.LENGTH_LONG) .show () else Toast.makeText (baseContext, "Sie scheinen ein Bot zu sein!", Toast.LENGTH_LONG) .show (), error -> Log.d ("ERROR", "Fehler beim Verbindungsaufbau zum Server"))
Zu diesem Zeitpunkt ist die App fertig. Sie können es auf Ihrem Emulator oder Gerät bereitstellen.
In früheren Schritten haben wir viele Annahmen über unseren Webserver getroffen. Es ist jetzt an der Zeit, es zu erstellen und sicherzustellen, dass es nicht von diesen Annahmen abweicht.
Ein schneller und einfacher Weg zum Erstellen eines voll funktionsfähigen Webservers besteht in der Verwendung der Node.js-Plattform und des Express.js-Frameworks. Um ein neues Node.js-Projekt zu erstellen, erstellen Sie ein neues Verzeichnis auf Ihrem Computer und führen Sie das aus npm init
Befehl drin.
mkdir my_web_server cd my_web_server; npm init -y
Um das Express-Framework zum Projekt hinzuzufügen, können Sie das verwenden npm installieren
Befehl.
npm install --save express
Zusätzlich benötigen wir das Request-Paket, um mit dem reCAPTCHA-Dienst zu kommunizieren. Installieren Sie es daher als eine andere Abhängigkeit.
npm install --save request
Sie können jetzt Ihren bevorzugten Code-Editor zum Erstellen einer neuen Datei verwenden index.js und beginnen Sie mit dem Schreiben des gesamten serverseitigen Codes.
Beginnen Sie mit dem Laden der beiden ausdrücken
und anfordern
Module mit der benötigen()
Funktion und Erstellen einer neuen Express-Anwendung durch Aufrufen der ausdrücken()
Funktion.
const express = erfordern ('express'); const request = required ('request'); const myApp = express ();
Für unsere Express-Anwendung muss ein Endpunkt aufgerufen werden bestätigen
, auf das mit der HTTP-Methode GET zugegriffen werden kann. Erstellen Sie dafür eine neue Route mit der erhalten()
Methode:
myApp.get ('/ validate', Funktion (req, resp) // mehr Code hier);
Um das von der Android-App generierte Token zu überprüfen, müssen Sie jetzt eine POST-Anforderung an den reCAPTCHA-Dienst senden. Die Anfrage muss Ihren geheimen Schlüssel und das Token selbst enthalten. Der folgende Code zeigt, wie Sie den Body der POST-Anforderung erstellen, indem Sie das Token aus der Abfragezeichenfolge extrahieren:
const postData = secret: '1234567890-abcdefghijklmnopqr', Antwort: req.query.user_token;
Um die POST-Anforderung tatsächlich zu erstellen, können Sie das aufrufen Post()
Methode der anfordern
Modul. Ihre Antwort ist ein kurzes JSON-Dokument, das einen aufgerufenen Schlüssel enthält Erfolg
. Wie Sie vielleicht erwarten, ist sein Wert wahr
Nur wenn der Benutzer den Test bestanden hat.
Der folgende Code zeigt Ihnen, wie Sie das JSON-Dokument analysieren, die Datei extrahieren Erfolg
Schlüssel und generieren Sie die Antworten "PASS" und "FAIL", die unsere Android-App benötigt:
request.post (url: 'https://www.google.com/recaptcha/api/siteverify'), Formular: postData, Funktion (Fehler, Antwort, Text) jsonData = JSON.parse (body); // Analysieren Sie das JSON-Dokument, wenn (jsonData.success) // Benutzer hat den Test bestanden resp.send ('PASS'); else // Benutzer hat den Test nicht bestanden resp.send ('FAIL');) ;
Zum Schluss müssen Sie die anrufen Hör mal zu()
Methode des Express-Anwendungsobjekts, damit es auf Verbindungen warten kann.
myApp.listen (8000);
An diesem Punkt ist unser Webserver fertig. Um es zu starten, kehren Sie zum Terminal zurück und führen Sie den folgenden Befehl aus:
Knoten index.js
Wenn Sie Ihre Android-App jetzt ausführen, die Taste drücken und ein CAPTCHA erfolgreich lösen, sollten Sie ein sehen Toast
Nachricht, die Ihnen sagt, dass Sie ein Mensch sind.
Sie wissen jetzt, wie Sie mit der SafetyNet-reCAPTCHA-API Ihre Android-App und Ihre Back-End-Infrastruktur gegen Bots schützen. Sie müssen sich nicht mehr um automatisierte Anmeldungen, Bildschirmschaber oder Bot-generierten Spam kümmern.
Weitere Informationen zur reCAPTCHA-API finden Sie in der offiziellen Dokumentation.
In der Zwischenzeit finden Sie einige unserer weiteren großartigen Beiträge zur Entwicklung von Android-Apps!