如何在 Android 中集成 Google reCAPTCHA?

javaobject oriented programmingprogramming更新于 2024/6/8 18:21:00

为了增强安全性并防止自动机器人未经授权的访问,将 Google reCAPTCHA 集成到 Android 应用程序中变得至关重要。通过集成 reCAPTCHA,开发人员可以有效地验证用户的真实性,从而降低与垃圾邮件、滥用和欺诈活动相关的潜在风险。

加强应用程序安全性和提供无缝用户体验的过程涉及三个步骤。首先,Android 开发人员从 Google reCAPTCHA 获取 API 密钥。接下来,他们将 reCAPTCHA 功能集成到其 Android 应用程序的用户界面中。最后,他们验证用户响应以确保 reCAPTCHA 验证成功。通过集成 Google reCAPTCHA,Android 开发人员可以增强应用程序安全性并为真正的用户创建受保护的环境。

Google reCAPTCHA

Google 提供的 Google reCAPTCHA 是一种广泛使用的安全服务,可保护网站和应用程序免受自动机器人和恶意活动的侵害。它向用户提出图像识别或复选框验证等挑战来确定他们的人类真实性。通过整合 reCAPTCHA,开发人员可以增强平台安全性,减少垃圾邮件和滥用,并确保更安全、更可靠的用户体验。

方法

有两种不同的方法可以将 Google reCAPTCHA 集成到 Android 应用中:

  • 将 reCAPTCHA API 与 WebView 结合使用

  • 将 reCAPTCHA API 与 SafetyNet API 结合使用(不使用 WebView)

这两种方法本质上都实现了将 Google reCAPTCHA 集成到 Android 应用中的相同目标,但第一种方法涉及使用 WebView 加载 reCAPTCHA API,而第二种方法直接利用 SafetyNet API 进行验证而不依赖 WebView。

将 reCAPTCHA API 与 WebView 结合使用

在此方法中,开发人员可以在他们的 Android 应用中创建专门用于加载 reCAPTCHA API 的 WebView。通过配置 WebView 以启用 JavaScript 并加载指定的 reCAPTCHA URL,它们可确保无缝集成。为了处理来自 re-CAPTCHA 的响应,开发人员实现了 WebViewClient 并覆盖了 shouldOverrideUrlLoading 函数。

在 handleRecaptchaResponse 的自定义实现中,他们直接从 URL 中提取 re-CAPTCHA 响应令牌。然后,开发人员使用 SafetyNet API 验证此令牌的有效性,以增加安全措施。成功验证后,他们便有权在其应用程序中执行所需的操作。

算法

  • 创建 WebView 并启用 JavaScript。

  • 在 WebView 中加载 reCAPTCHA API URL。

  • 实现 WebViewClient 并覆盖 shouldOverrideUrlLoading。

  • 在 shouldOverrideUrlLoading 内部,从 URL 中提取 reCAPTCHA 响应令牌。

  • 使用 SafetyNet API 验证响应令牌的有效性。

  • 如果验证成功,请在您的应用程序中执行所需的操作。

示例

import android.annotation.SuppressLint;
import android.os.Bundle;
import android.webkit.WebResourceRequest;
import android.webkit.WebView;
import android.webkit.WebViewClient;

import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {

   private static final String RECAPTCHA_SITE_KEY = "YOUR_RECAPTCHA_SITE_KEY";
   private static final String RECAPTCHA_HTML = "<html><head><script src='https://www.google.com/recaptcha/api.js'></script></head><body><form action='verify.php' 
method='post'><div class='g-recaptcha' data-sitekey='%s'></div><br><input type='submit' value='Submit'></form></body></html>";

   private WebView webView;

   @SuppressLint("SetJavaScriptEnabled")
   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);

      webView = findViewById(R.id.webView);
      webView.getSettings().setJavaScriptEnabled(true);
      webView.setWebViewClient(new WebViewClient() {
         @Override
         public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
            // Load URL within the WebView
            view.loadUrl(request.getUrl().toString());
            return true;
         }
      });

      // Load the reCAPTCHA HTML page
      String html = String.format(RECAPTCHA_HTML, RECAPTCHA_SITE_KEY);
      webView.loadData(html, "text/html", "UTF-8");
   }
}

//activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/
android"
   android:layout_width="match_parent"
   android:layout_height="match_parent">

   <WebView
      android:id="@+id/webView"
      android:layout_width="match_parent"
      android:layout_height="match_parent" />

</RelativeLayout>

输出

将 reCAPTCHA API 与 SafetyNet API 结合使用(不使用 WebView)

此方法无需使用 WebView,而是直接利用 SafetyNet API 来验证 reCAPTCHA 响应。您可以从 SafetyNet API 调用 verifyWithRecaptcha 方法,提供您的 reCAPTCHA 密钥和用户的响应令牌作为参数。然后,API 会异步验证响应令牌。在成功回调中,您可以检查令牌结果是否为空。如果不为空,则表示 reCAPTCHA 验证成功,允许您在应用中继续执行所需的操作。

算法

  • 从 SafetyNet API 调用 verifyWithRecaptcha 方法。

  • 传入您的 reCAPTCHA 密钥和用户的响应令牌。

  • SafetyNet API 异步验证响应令牌。

  • 在成功回调中,检查令牌结果是否为空。

  • 如果令牌结果不为空,则 reCAPTCHA 验证成功。

  • 根据验证结果在您的应用中执行所需的操作。

示例

import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

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 com.google.android.gms.tasks.Task;

public class MainActivity extends AppCompatActivity {

   private static final String TAG = "MainActivity";
   private static final String SITE_KEY = "YOUR_SITE_KEY";

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

      verifyWithRecaptcha();
   }

   private void verifyWithRecaptcha() {
      SafetyNet.getClient(this).verifyWithRecaptcha(SITE_KEY)
            .addOnSuccessListener(this, new OnSuccessListener<SafetyNetApi.RecaptchaTokenResponse>() {
               @Override
               public void onSuccess(SafetyNetApi.RecaptchaTokenResponse response) {
                  if (response != null && response.getTokenResult() != null) {
                     String userResponseToken = response.getTokenResult();
                     Log.d(TAG, "onSuccess: userResponseToken=" + userResponseToken);
                     // Send the user response token to your server for verification
                     // Handle the server response accordingly
                     Toast.makeText(MainActivity.this, "reCAPTCHA success", Toast.LENGTH_SHORT).show();
                  }
               }
            })
            .addOnFailureListener(this, new OnFailureListener() {
               @Override
               public void onFailure(@NonNull Exception e) {
                  if (e instanceof ApiException) {
                     ApiException apiException = (ApiException) e;
                     int statusCode = apiException.getStatusCode();
                     Log.d(TAG, "onFailure: statusCode=" + statusCode);
                     // Handle error based on the status code
                     Toast.makeText(MainActivity.this, "reCAPTCHA failed", Toast.LENGTH_SHORT).show();
                  } else {
                     // Handle other exceptions
                     Toast.makeText(MainActivity.this, "Error occurred", Toast.LENGTH_SHORT).show();
                  }
               }
            });
   }
}

dependencies {
   // Other dependencies
   implementation 'com.google.android.gms:play-services-safetynet:17.0.0'
}

输出

结论

在本教程中,将 Google reCAPTCHA 集成到 Android 应用程序中是增强安全性和防止自动机器人活动的重要一步。无论是使用带有 WebView 的 reCAPTCHA API 还是直接使用 SafetyNet API,开发人员都可以有效地验证用户真实性,减少垃圾邮件和滥用,并确保更安全、更可靠的用户体验。通过实施 reCAPTCHA,Android 应用程序可以显著加强其安全措施,并为真正的用户提供值得信赖的环境。


相关文章