📅  最后修改于: 2021-01-05 08:44:44             🧑  作者: Mango
在本教程中,我们将学习Google reCaptcha的工作过程并将其集成到我们的Android应用程序中。 Google的reCaptcha保护我们的应用程序免受恶意流量的侵害。它是使用SafetyNet API实现的。
通过调用Android应用程序,SafetyNet服务器与您的服务器之间的网络调用来验证Google reCAPTCHA:
在创建API密钥之前,请仔细阅读API服务条款https://developers.google.com/terms/。
让我们创建一个将Google reCAPTCHA集成到我们的Android应用程序中的示例。
在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文件中添加互联网权限。
在activity_main.xml文件中添加以下代码。
在MainActivity.java类文件中添加以下代码。在此类中,我们将客户端与SafetyNet服务器进行集成,并以JSON字符串形式获取响应。
用您的实际站点密钥和秘密密钥替换SITE_KEY和SECRET_KEY的值。单击该按钮时,如果返回成功,则调用SafetyNet.getClient()方法获取站点密钥,然后调用handleSiteVerify()进行令牌验证。
Volley库用于以下目的:
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);
}
}
输出: