Implementieren Sie reCAPTCHA v3 in Java / Spring

Einführung

Selbst wenn ich gegoogelt habe, gab es keinen Artikel für Java, und die offizielle Website war etwas schwer zu verstehen, deshalb habe ich sie zusammengefasst.

Offizieller Link

Referenzlink

Wie man sich registriert

Registrieren Sie sich zunächst, um den Dienst zu nutzen.

Ich habe reCAPTCHA v3 in das Anfrageformular aufgenommen! ⇒ Siehe "So registrieren Sie reCAPTCHA v3"

Implementierungsmethode

Einmal registriert, müssen Sie es nur noch implementieren.

Client-Seite

HTML Fügen Sie dem Formular-Tag Folgendes hinzu. Setzen Sie das von JavaScript erhaltene Token auf diesen Wert und senden Sie es ab. Wenn Sie Ajax verwenden, müssen Sie dies nicht schreiben, indem Sie direkt "Token" im Parameter "Request" angeben.

hoge.html


<input type="hidden" name="recaptchaResponse" id="recaptchaResponse">

Fügen Sie dem Skriptleseteil Folgendes hinzu. Stellen Sie reCAPTCHA auf Ihrer Website zur Verfügung. Ersetzen Sie den zum Zeitpunkt der Registrierung erhaltenen Site-Schlüssel durch "(Site-Schlüssel)".

hoge.html


<script src="'https://www.google.com/recaptcha/api.js?render=' +(Site-Schlüssel)"></script>

JavaScript Implementieren Sie die beim Senden des Formulars ausgeführte Funktion wie folgt. Der in Aktion festgelegte Wert (im Folgenden "Kontaktformular") wird in "Antwort von reCAPTCHA" gespeichert. Daher kann er für die Analyse hilfreich sein, wenn Sie festlegen, wo er auf der Site ausgeführt wurde.

hoge.js


$form = $(/*Form bekommen*/);
$button = $(/*Holen Sie sich die Senden-Schaltfläche im Formular*/);

$button.click(function() {
		//Für reCAPTCHA v3
		grecaptcha.ready(function () {
			grecaptcha.execute((Site-Schlüssel), {action: 'contact_form'}).then(function(token) {
				$('#recaptcha-response').val(token);

				//Der in der Funktion vor der Implementierung von reCAPTCHA beschriebene Prozess wird hier beschrieben.

				$form.submit();
			});
		});
});

Rückseite

Controller Implementieren Sie die POST-Zielmethode wie folgt. Eigentlich sollte der logische Teil auf die Serviceschicht ausgeschnitten werden. Das BOT-Urteil (wenn Aussage Teil) wird im nächsten Modellabschnitt erläutert.

HogeController.java


@RequestMapping(value = "/hoge", method = RequestMethod.POST)
public String hogePost(
		@Valid @ModelAttribute("hogeForm") HogeForm hogeForm,
		BindingResult bindingResult,
		HttpServletRequest request, SitePreference sitePreference, Model model) {

	String url = "https://www.google.com/recaptcha/api/siteverify?secret=" +(Geheimer Schlüssel)+ "&response=" + hogeForm.getRecaptchaResponse;
	RestTemplate restTemplate = new RestTemplate();
	RecaptchaResult result = restTemplate.getForObject(url, RecaptchaResult.class);

	log.info("reCAPTCHA result: " + result.toString());

	if (result.isSuccess()) {
		if ( 0.5 <= result.getScore()) {
			//Beschreiben Sie die Verarbeitung, wenn sie nicht als BOT beurteilt wird
		} else {
			//Beschreiben Sie die Verarbeitung, wenn sie als BOT beurteilt wird
		}
	} else {
		//Beschreiben Sie die Verarbeitung, wenn die Verbindung zu reCAPTCHA nicht hergestellt werden kann
	}
}

Model Implementieren Sie ein Modell, das die Antwort der reCAPTCHA-API wie folgt speichert. Ich benutze Lombok, das automatisch Getter und Setter generiert. Weitere Informationen zum Inhalt der Antwort finden Sie unter Offiziell.

Wichtige Sache

Beachten Sie, dass die Eigenschaft "success" den Erfolg / Misserfolg der API-Verbindung angibt, nicht die Beurteilung von BOT. In reCAPTCHA wird anhand seines eigenen Programms beurteilt, ob es sich um einen BOT handelt oder nicht, basierend auf der zurückgegebenen Eigenschaft "score" (0,0 ~ 1,0). Je näher die "Punktzahl" an 1 liegt, desto geringer ist die Wahrscheinlichkeit eines BOT, und je näher sie an 0 liegt, desto höher ist die Wahrscheinlichkeit eines BOT. Google Official Interpreting the Score gibt an, dass der anfängliche Schwellenwert 0,5 betragen sollte.

RecaptchaResult.java


package com.croooober.v1.cr_www.model.api;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Data;

@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class RecaptchaResult {
    private boolean success;
    private String challenge_ts;
    private String hostname;
    private float score;
    private String action;

    public RecaptchaResult() {
    }
}

Außerdem wurden dem Formularobjekt Eigenschaften hinzugefügt.

HogeForm.java


private String recaptchaResponse;

Wenn Sie es gut implementieren können, können Sie das Ergebnis mit der Protokollausgabe wie folgt überprüfen.

reCAPTCHA result: RecaptchaResult(success=true, challenge_ts=2020-01-08T04:19:27Z, hostname=hoge.com, score=0.9, action=contact_form)

Impressionen

Zuerst dachte ich, wenn ich es in die API wirf, wird es beurteilen, ob es BOT ist oder nicht. Eigentlich musste ich nach meinem eigenen Programm anhand der Punktzahl urteilen, was etwas verwirrend war.

Recommended Posts

Implementieren Sie reCAPTCHA v3 in Java / Spring
Implementierung der zweistufigen Authentifizierung in Java
Implementieren Sie die Standardauthentifizierung in Java
Implementieren Sie eine Kombination aus Mathematik in Java
2 Implementieren Sie eine einfache Syntaxanalyse in Java
Implementieren Sie das Senden von E-Mails in Java
Implementieren Sie eine funktionsähnliche schnelle Sortierung in Java
Implementieren Sie rm -rf in Java.
Implementieren Sie die XML-Signatur in Java
Implementieren Sie einen tabellengesteuerten Test in Java 14
3 Implementieren Sie einen einfachen Interpreter in Java
Implementieren Sie die PHP-Implodierungsfunktion in Java
Implementieren Sie die REST-API mit Spring Boot
Implementieren Sie die Spring Boot-Anwendung in Gradle
Frühling Java
Versuchen Sie, Yuma in Java zu implementieren
1 Implementieren Sie eine einfache Phrasenanalyse in Java
So implementieren Sie die Datumsberechnung in Java
So implementieren Sie den Kalman-Filter mit Java
Implementieren Sie API Gateway Lambda Authorizer in Java Lambda
Versuchen Sie, n-ary Addition in Java zu implementieren
Erstellen Sie mit IntelliJ ein Java Spring Boot-Projekt
So erzwingen Sie Codierungskonventionen in Java
Implementieren Sie so etwas wie einen Stack in Java
[* Java *] Ich habe am JJUG CCC 2019 Spring teilgenommen
[Spring MVC] Implementieren Sie die in der URL enthaltenen dynamischen Parameter ohne Verwendung von Optional (~ Java7).
Partisierung in Java
Änderungen in Java 11
Janken in Java
Umfangsrate in Java
[Java] Spring DI ③
FizzBuzz in Java
Java-Tipps - Erstellen Sie mit Gradle ein Spring Boot-Projekt
[JAVA] [Spring] [MyBatis] Verwenden Sie IN () mit SQL Builder
Injizieren Sie den Logger im Frühjahr
Interpreter-Implementierung durch Java
Machen Sie einen Blackjack mit Java
Janken App in Java
Einschränkungsprogrammierung in Java
Setzen Sie Java8 in Centos7
NVL-artiger Typ in Java
"Hallo Welt" in Java
Aufrufbare Schnittstelle in Java
Ich habe versucht, die Firebase-Push-Benachrichtigung in Java zu implementieren
Rufen Sie die Amazon Product Advertising API 5.0 (PA-API v5) in Java auf
Kommentare in der Java-Quelle
Azure funktioniert in Java
Formatieren Sie XML in Java
Einfache HTML-Spezialchars in Java
Boyer-Moore-Implementierung in Java
Verwenden Sie Interceptor im Frühjahr
Hallo Welt in Java
Verwenden Sie OpenCV mit Java
WebApi-Memorandum mit Java
Typbestimmung in Java
Implementieren Sie Singleton mit Enum schnell in Java
Befehle in Java ausführen (Ping)
Verschiedene Threads in Java
Implementierung der Heap-Sortierung (in Java)
Microservices in Spring Cloud