如何在Android中整合Google reCAPTCHA?


為了增強安全性並防止自動化機器人未經授權的訪問,將Google reCAPTCHA整合到Android應用程式中變得至關重要。透過整合reCAPTCHA,開發人員可以有效地驗證使用者的真實性,從而降低與垃圾郵件、濫用和欺詐活動相關的潛在風險。

強化應用程式安全性和提供無縫使用者體驗的過程涉及三個步驟。首先,Android開發人員從Google reCAPTCHA獲取API金鑰。接下來,他們將reCAPTCHA功能整合到其Android應用程式的使用者介面中。最後,他們驗證使用者響應以確保成功reCAPTCHA驗證。透過整合Google reCAPTCHA,Android開發人員可以增強應用程式安全性併為真實使用者建立受保護的環境。

Google reCAPTCHA

Google reCAPTCHA由Google提供,是一種廣泛使用的安全服務,可保護網站和應用程式免受自動化機器人和惡意活動的侵害。它向用戶提出諸如影像識別或複選框驗證之類的挑戰,以確定其人類真實性。透過整合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)

此方法透過直接利用SafetyNet API驗證reCAPTCHA響應來消除使用WebView的需要。您可以從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應用程式可以顯著加強其安全措施併為真實使用者提供可信賴的環境。

更新於: 2023年7月27日

595 次瀏覽

開啟你的職業生涯

透過完成課程獲得認證

開始
廣告