Slik legger du til CAPTCHAs i Android Apps

Hvis du utvikler en Android-applikasjon som trenger å kommunisere med din back-end-server, er det viktig at du tar skritt for å forsvare det mot botsautomatiserte skript som prøver å passere for menneske. Ellers står serveren din veldig sannsynlig for å bli overskredet av dem.

CAPTCHAs, kort for helt automatiserte Public Turing-tester for å fortelle datamaskiner og mennesker, er for tiden det mest effektive forsvaret mot bots. Som du kanskje allerede vet, er de vanligvis bilde-, stemme- eller sunn fornuftbaserte tester som er enkle for mennesker, men ekstremt vanskelig for datamaskiner.

I denne veiledningen viser jeg deg hvordan du bruker den nylig utgitte SafetyNet reCAPTCHA API for å legge til CAPTCHAer i Android-appene dine.

Forutsetninger

For å kunne følge denne opplæringen trenger du følgende:

  • Android Studio 3.0 Canary 4 eller høyere
  • En enhet eller emulator som kjører Android 4.4 eller høyere
  • Node.js 8.1.3 eller høyere

1. Prosjektoppsett

Start Android Studio og opprett et nytt prosjekt med en tom aktivitet. I Konfigurer ditt nye prosjekt skjema, pass på at du skriver inn et meningsfull pakke navn - du vil bruke det mens du registrerer appen din med reCAPTCHA tjenesten.

I tillegg sjekker du Inkluder Kotlin Support felt. Fordi Kotlin er nå et offisielt Android-språk, bruker vi det i stedet for Java i denne opplæringen.

SafetyNet-APIer er en del av Google Play-tjenestene. For å kunne bruke dem i prosjektet, legg til følgende gjennomføring avhengighet til build.gradle fil av app modul:

implementering 'com.google.android.gms: play-services-safetynet: 11.0.2'

I tillegg, for å utføre nettverksrelaterte operasjoner, bruker vi Brenselbiblioteket, som har en svært kortfattet Kotlin-basert API. Legg derfor til den som en annen gjennomføring avhengighet.

implementering 'com.github.kittinunf.fuel: fuel-android: 1.8.0'

Du kan ikke utføre nettverksrelaterte operasjoner uten INTERNETT tillatelse, så legg til følgende linje i prosjektets manifestfil:

Til slutt trykker du på Synkroniser nå knappen for å fullføre prosjektkonfigurasjonen.

2. Oppnå reCAPTCHA Keys

Du trenger to nøkler før du kan bruke reCAPTCHA-tjenesten:

  • en nettstednøkkel, som må sendes til tjenesten fra Android-appen din
  • og en hemmelig nøkkel, som må sendes til tjenesten fra din back-end-server

For å få nøklene, bruk din Google-konto og logg inn på reCAPTCHA administrasjonskonsollen. Hvis du åpner konsollen for første gang, blir du automatisk presentert med et kort registreringsskjema hvor du kan skrive inn programmets navn på pakken.

Når du godtar vilkårene for reCAPTCHA, fortsett og trykk på Registrere knappen for å generere begge tastene.

Du kan nå legge til nøkkelen til Android Studio-prosjektet ditt ved å bare nevne det inne i res / verdier / strings.xml fil:

ABCDEFGHIJKLMNOPQ1234567890

Vi jobber bare med den hemmelige nøkkelen mot slutten av denne opplæringen, så vær oppmerksom på at det er et sikkert sted for nå.

3. Generering av CAPTCHAer

Når vi hører ordet CAPTCHA, tenker vi vanligvis på rotete bilder som inneholder vanskelige å lese bokstaver og tall. Slike CAPTCHAer, men takket være fremskritt innen datasynteknologi, er ikke lenger gode nok til å stoppe alle bots.

CAPTCHAer generert av reCAPTCHA-tjenesten er svært avanserte og veldig interaktive. Faktisk er løsningen av dem likt å spille enkle spill. Du kan derfor ikke direkte legge dem inn i aktivitetens layout. I stedet må du legge til en knapp i layouten, som, når den trykkes, burde føre brukeren til en ny skjerm eller dialog som inneholder CAPTCHA.

Følgende kode viser deg hvordan du legger til en Knapp widget til aktiviteten din layout XML-fil:

Før du begynner å generere CAPTCHAer, må du initialisere en klient for SafetyNet API. Du kan gjøre det ved å ringe getClient () metode av Sikkerhetsnett klasse. Følgelig legger du til følgende kode inne i onCreate () metode for din Aktivitet klasse:

val myClient: SafetyNetClient = SafetyNet.getClient (dette)

CAPTCHA-ene må vises når brukeren trykker på knappen, så legg til en hendelseshåndterer på klikk ved hjelp av setOnClickListener () metode. På innsiden av handleren er alt du trenger å gjøre å ringe verifyWithRecaptcha () metode og passere nettstedet ditt nøkkelen som et argument for det for å åpne en dialog som inneholder en CAPTCHA.

Returneringsverdien til verifyWithRecaptcha () metoden er a Oppgave gjenstand. Ved å legge ved en suksesshåndterer til det, vil du kunne skaffe en RecaptchaTokenResponse objekt som inneholder et token du kan bruke til å fortelle om brukeren passerte eller mislyktes CAPTCHA. Dette er hvordan:

er_you_human_button.setOnClickListener myClient .verifyWithRecaptcha (resources.getString (R.string.my_site_key)) .addOnSuccessListener successEvent -> valget token: String = successEvent.tokenResult // Mer kode her

4. Validering av CAPTCHA-koder

Tildelen du fikk i forrige trinn må igjen sendes til reCAPTCHA-tjenesten for å sjekke om brukeren har bestått eller mislyktes testen. Men denne gangen må anropet til reCAPTCHA-tjenesten bli gjort fra din back-end-server.

Serveren vil selvfølgelig ikke ha token, med mindre din Android-app sender den til den. Derfor må vi nå skrive kode for å sende tokens fra Android-appen til serveren.

For nå, må vi anta at serveren vår har et sluttpunkt kalt validere, som kan akseptere token som en forespørselsstrengsparameter. Jeg skal bruke 10.0.2.2 som serverens IP-adresse og 8000 som havn. Hvis du har tenkt å kjøre serveren på din egen datamaskin og appen på en emulator som kjører på samme datamaskin, kan du også bruke samme IP-adresse.

val serverURL: String = "http://10.0.2.2:8000/validate"

Du kan nå ringe httpGet () Metode som tilbys av Brenselbiblioteket for å sende token til serveren. Metoden forventer en liste over søkeordsparametre som eneste argument, så jeg foreslår at du bruker liste over() verktøymetode for å lage en liste som inneholder et enkelt element: symbolet tilordnet en navngitte parameter user_token.

Fordi det httpGet () Metoden går asynkront, du må ringe responseString () metode for å håndtere returverdi. Følgende kode viser deg hvordan:

serverURL.httpGet (listOf ("user_token" til token)) .responseString request, response, result -> // Mer kode her

Du kan se at vi nå har tilgang til en resultat gjenstand. I tilfelle ingen feil, vil den inneholde serverens svar som en streng.

La oss anta at serveren vår returnerer strengen "PASS" hvis brukeren passerer testen, og "FAIL" ellers. Det du egentlig gjør når brukeren passerer eller feiler testen, er selvfølgelig opp til deg. For nå foreslår jeg at du bare viser riktig Skål meldinger. Følgende kode viser hvordan du gjør det så kortfattet:

result.fold (data -> if (data.contains ("PASS")) Toast.makeText (baseContext, "Du ser ut til å være et menneske.", Toast.LENGTH_LONG) .show () annet Toast.makeText (baseContext, "Du synes å være en bot!", Toast.LENGTH_LONG) .show (), error -> Log.d ("FEIL", "Feil å koble til serveren"))

På dette tidspunktet er appen klar. Du kan gå videre og distribuere den til din emulator eller enhet.

5. Opprette serveren

Vi har gjort mange forutsetninger om vår webserver i tidligere trinn. Det er nå på tide å lage det, og sørg for at det ikke avviger fra disse forutsetningene.

En rask og enkel måte å lage en fullstendig funksjonell webserver på er å bruke Node.js-plattformen og Express.js-rammen. For å opprette et nytt Node.js-prosjekt, lag en ny katalog på datamaskinen din og kjør npm init kommandoen inne i den.

mkdir my_web_server cd my_web_server; npm init -y

For å legge til Express-rammeverket for prosjektet, kan du bruke npm installasjon kommando.

npm installere - lagre ekspress

I tillegg vil vi trenge Request-pakken for å kommunisere med reCAPTCHA-tjenesten. Derfor installer den som en annen avhengighet.

npm installere - lagre forespørsel

Du kan nå bruke favorittkodeditoren din til å opprette en ny fil som heter index.js og begynn å skrive all nødvendig server-side kode.

Begynn med å laste inn begge uttrykke og be om moduler som bruker kreve () funksjon og opprett en ny Express-applikasjon ved å ringe uttrykke() funksjon.

const express = kreve ('express'); const request = krever ('request'); const myApp = express ();

Vår Express-applikasjon må ha et sluttpunkt kalt validere, som kan nås ved hjelp av HTTP GET-metoden. Derfor opprett en ny rute for den ved hjelp av få() metode:

myApp.get ('/ validate', funksjon (req, resp) // Mer kode her);

For å validere token som genereres av Android-appen, må du nå foreta en POST-forespørsel til reCAPTCHA-tjenesten. Forespørselen må inneholde din hemmelige nøkkel og selve symbolet. Følgende kode viser hvordan du bygger POST-forespørselen sin kropp ved å trekke ut token fra spørringsstrengen:

const postData = hemmelig: '1234567890-abcdefghijklmnopqr', svar: req.query.user_token;

For å faktisk gjøre POST-forespørselen, kan du ringe til post() metode av be om modul. Dens respons er et kort JSON-dokument som inneholder en nøkkel kalt suksess. Som du kanskje forventer, er verdien av den ekte bare hvis brukeren har bestått testen.

Følgende kode viser hvordan du analyserer JSON-dokumentet, trekker ut suksess nøkkel, og generer "PASS" og "FAIL" svarene våre Android app trenger:

request.post (url: 'https://www.google.com/recaptcha/api/siteverify', skjema: postData, funksjon (feil, svar, kropp) jsonData = JSON.parse (body); // Parse JSON-dokumentet hvis (jsonData.success) // Brukeren passerte testen resp.send ('PASS'); else // Brukeren passerte ikke testen resp.send ('FAIL');) ;

Til slutt må du ringe til lytte() metode for Express-applikasjonsobjektet slik at det kan lytte til tilkoblinger.

myApp.listen (8000);

På dette tidspunktet er vår webserver klar. For å starte det, gå tilbake til terminalen og kjør følgende kommando:

node index.js

Hvis du kjører Android-appen din nå, trykker du på knappen, og løser en CAPTCHA, bør du se en Skål melding som forteller deg at du er menneskelig.

Konklusjon

Du vet nå hvordan du bruker SafetyNet reCAPTCHA API for å sikre din Android app og back-end infrastruktur mot bots. Du trenger ikke å bekymre deg for automatiserte registreringer, skjermskraper eller botgenerert spam lenger.

Hvis du vil vite mer om reCAPTCHA API, kan du se den offisielle dokumentasjonen.

I mellomtiden, sjekk ut noen av våre andre flotte innlegg på Android app utvikling!