在Android应用程序中使用Google reCAPTCHA

本文概述

  • Google reCaptcha的工作
  • 生成reCAPTCHA网站密钥和秘密密钥
  • 集成Google reCAPTCHA的Android示例
【在Android应用程序中使用Google reCAPTCHA】在本教程中, 我们将学习Google reCaptcha的工作过程并将其集成到我们的Android应用程序中。 Google的reCaptcha保护我们的应用程序免受恶意流量的侵害。它是使用SafetyNet API实现的。
Google reCaptcha的工作 通过调用Android应用程序, SafetyNet服务器与你的服务器之间的网络调用来验证Google reCAPTCHA:
  • 一个Android应用程序通过Site Key向SafetyNet服务器发出请求, 以进行reCAPTCHA验证。
  • SafetyNet服务器使用站点密钥通过验证码令牌对Android应用生成响应。
  • 验证码令牌已发送到你的服务器, 以使用密钥进行验证。
  • 你的android服务器会向安全网发出请求, 要求使用“密钥”验证验证码令牌。
  • SafetyNet验证令牌响应, 并将结果返回为成功或失败。
  • 你的Android服务器会通过验证令牌来通知Android应用, 然后将结果返回为成功还是失败。
在Android应用程序中使用Google reCAPTCHA

文章图片
生成reCAPTCHA网站密钥和秘密密钥 在创建API密钥之前, 请仔细阅读API服务条款https://developers.google.com/terms/。
  • 注册Android reCAPTCHA网站https://g.co/recaptcha/androidsignup。
在Android应用程序中使用Google reCAPTCHA

文章图片
  • 提供标签, 包装名称的输入详细信息, 并接受reCAPTCHA条款和服务。标签:这是密钥的唯一标签。你可以使用公司或组织的名称。软件包名称:这是你的android应用程序的软件包名称。
在Android应用程序中使用Google reCAPTCHA

文章图片
  • 在下一页生成站点密钥, 秘密密钥, 客户端集成代码和服务器端代码。
在Android应用程序中使用Google reCAPTCHA

文章图片
集成Google reCAPTCHA的Android示例 让我们创建一个将Google reCAPTCHA集成到我们的Android应用程序中的示例。
build.gradle
在build.gradle文件中添加以下SafetyNet和Volley依赖项。
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.srcmini.com.googlerecaptcha.MainActivity"> < TextViewandroid: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" /> < Buttonandroid: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库用于以下目的:
  • Volley库的RequestQueue在队列中维护服务器调用。
  • StringRequest用于从服务器获取响应作为JSON字符串。
  • 如果setRetryPolicy()方法在指定时间内失败, 则重试服务器调用。
package example.srcmini.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; @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btnverifyCaptcha = findViewById(R.id.button); btnverifyCaptcha.setOnClickListener(this); queue = Volley.newRequestQueue(getApplicationContext()); }@Overridepublic void onClick(View view) {SafetyNet.getClient(this).verifyWithRecaptcha(SITE_KEY).addOnSuccessListener(this, new OnSuccessListener< SafetyNetApi.RecaptchaTokenResponse> () {@Overridepublic void onSuccess(SafetyNetApi.RecaptchaTokenResponse response) {if (!response.getTokenResult().isEmpty()) {handleSiteVerify(response.getTokenResult()); }}}).addOnFailureListener(this, new OnFailureListener() {@Overridepublic 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()); }}}); }protectedvoid handleSiteVerify(final String responseToken){//it is google recaptcha siteverify server//you can place your server urlString url = "https://www.google.com/recaptcha/api/siteverify"; StringRequest request = new StringRequest(Request.Method.POST, url, new Response.Listener< String> () {@Overridepublic 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() {@Overridepublic void onErrorResponse(VolleyError error) {Log.d(TAG, "Error message: " + error.getMessage()); }}) {@Overrideprotected Map< String, String> getParams() {Map< String, String> 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); }}

输出:
在Android应用程序中使用Google reCAPTCHA

文章图片
在Android应用程序中使用Google reCAPTCHA

文章图片
在Android应用程序中使用Google reCAPTCHA

文章图片
在Android应用程序中使用Google reCAPTCHA

文章图片

    推荐阅读