Créez "Je ne suis pas un robot" en Java EE (Jakarta EE)

0. Environnement

L'environnement dans lequel cet article a été écrit

OS...Windows 10 IDE...Eclipse 2020-3 Java...Open JDK 14 Conteneur de servlet ... Apache Tomcat 9.0.33

1. Créez reCAPTCHA

Tout d'abord, accédez au site reCAPTCHA. reCAPTCHA

Créez avec le bouton +.

Entrez les informations de votre site.

SS1.png

Entrez un nom descriptif pour l'étiquette.

Pour le type reCAPTCHA, je veux faire "Je ne suis pas un robot", j'ai donc choisi reCAPTCHA v2. Ensuite, la case à cocher "Je ne suis pas un robot" apparaîtra, alors assurez-vous qu'elle est sélectionnée.

Pour le domaine, saisissez le domaine pour lequel "Je ne suis pas un robot" est défini. Si vous enregistrez le domaine principal, vous pouvez l'utiliser dans des sous-domaines. Si vous souhaitez l'utiliser dans l'environnement de développement, enregistrez également "localhost".

Le propriétaire ... eh bien, vous pouvez faire ce que vous voulez.

Enfin, acceptez les conditions d'utilisation de reCAPTCHA, indiquez si vous souhaitez envoyer l'alerte au propriétaire et cliquez sur Envoyer

L'écran suivant affichera deux chaînes, alors notez les deux.

2. Créez un nouveau projet dans Eclipse

Cette fois, réglez-le sur "RecaptchaTest". (Si vous l'avez déjà fait, utilisez-le.)

3. Création HTML

Créons un nouveau fichier HTML dans le WebContent du projet créé dans Eclipse.

Ou vous pouvez le créer avec un éditeur externe et le coller dans votre projet.

Je n'écris généralement pas ce genre de code, mais cette fois c'est un exemple. .. ..

<!doctype html>
<html lang="ja">
	<head>
		<meta charset="utf-8">
		<title>échantillon de reCAPTCHA</title>
		<script src="https://www.google.com/recaptcha/api.js" async defer></script>
	</head>
	<body>
		<form action="login" method="post">
			ID:<input type="text" name="id"><br>
mot de passe:<input type="password" name="current-password">
			<div class="g-recaptcha" data-sitekey="[Entrez la chaîne dans la case ci-dessus des deux chaînes affichées précédemment.]"></div>
			<input type="submit" value="S'identifier">
		</form>
	</body>
</html>

L'important est de lire le script de la tête et sous la forme

<div class="g-recaptcha" data-sitekey="[Celui qui a été écrit dans la case ci-dessus qui était affiché plus tôt]">

Mettre.

Le type "Je ne suis pas un robot" sera affiché là où vous mettez cette div.

Donc, après avoir terminé le HTML ci-dessus, essayons de l'exécuter sur le serveur. Si ça ressemble à l'image ci-dessous, ça va! !!

SS3.PNG

4. Création de classe

Créons une classe (modèle) qui interroge le reCAPTCHA de Google pour obtenir des résultats.

Le mécanisme est simple, placez les paramètres spécifiés sur l'URL déterminée, POST, et le JSON sera retourné dans la réponse.

Modifions SECRET_KEY dans le code ci-dessous par la chaîne de caractères que nous avons obtenue ~~~

package com.sakurai_shinya.recaptcha;

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;

import javax.net.ssl.HttpsURLConnection;

public class RecaptchaAuthenticator {

	private static final String URL = "https://www.google.com/recaptcha/api/siteverify";
	private static final String SECRET_KEY = "[La chaîne qui était dans la case ci-dessous]";

	public static boolean checkRecaptcha(String userToken) throws IOException {
		String recaptchaResponse = post(new URL(URL), "secret=" + SECRET_KEY + "&response=" + userToken);
		return recaptchaResponse.contains("\"success\": true,");
	}

	private static String post(URL url, String parameters) throws IOException {
		HttpsURLConnection con = (HttpsURLConnection) url.openConnection();
		con.setDoOutput(true);
		try (DataOutputStream dos = new DataOutputStream(con.getOutputStream())) {
			dos.writeBytes(parameters);
			dos.flush();
		}
		if (con.getResponseCode() != 200) {
			throw new IOException("Une erreur s'est produite lors de la communication avec le serveur.");
		}
		StringBuilder sb = new StringBuilder();
		try (BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()))) {
			String tempStr;
			while ((tempStr = in.readLine()) != null) {
				sb.append(tempStr);
			}
		}
		return sb.toString();
	}
}

Puisqu'il est gênant, j'ai fait la réponse comme contient, OK si "" succès ": true," est inclus, et NG s'il n'est pas inclus. Si vous le faites correctement, vous devez créer un objet correctement et l'analyser.

5. Créer un contrôleur (servlet)

Je vais mettre tout le code du servlet dessus, mais uniquement au POST. Ou plutôt, regardez simplement POST

package com.sakurai_shinya.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.sakurai_shinya.recaptcha.RecaptchaAuthenticator;

@WebServlet("/login")
public class Login extends HttpServlet {
	private static final long serialVersionUID = 1L;

	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
		request.setCharacterEncoding("utf-8");
		response.setCharacterEncoding("utf-8");
		response.setContentType("text/html");
		super.service(request, response);
	}

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
		response.sendRedirect("login.html");
	}

	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
		boolean recaptchaResult = false;
		try {
			recaptchaResult = RecaptchaAuthenticator.checkRecaptcha(request.getParameter("g-recaptcha-response"));
		} catch (IOException e) {
			response.getWriter().append("Une erreur s'est produite lors de la communication avec le serveur d'authentification reCAPTCHA." + e.toString());
		}
		if (recaptchaResult) {//Succès de reCAPTCHA
			//Le processus de correspondance de l'ID et du mot de passe ici.
			String inputId = request.getParameter("id");
			String inputPass = request.getParameter("current-password");
			response.getWriter().append("Certification reCAPTCHA réussie.<br>ID:" + inputId + "<br>mot de passe:" + inputPass);
		} else {//échec de reCAPTCHA
			response.getWriter().append("L'authentification ReCAPTCHA a échoué.");
		}
	}
}
RecaptchaAuthenticator.checkRecaptcha(request.getParameter("g-recaptcha-response"));

Si vous appelez checkRecaptcha de la classe que vous avez créée précédemment, le résultat sera vrai ou faux, ou une exception sera renvoyée. Si vrai, reCAPTCHA réussit, si faux, reCAPTCHA échoue et l'exception est une erreur.

À propos, si vous collez le type g-recaptcha sur le formulaire, les paramètres appelés g-recaptcha-response seront POSTÉS avec une force mystérieuse. Vous envoyez ceci au serveur de Google pour identifier l'utilisateur ~~~

6. Test

Essayons-le! result1.PNG

Testez avec et sans ce contrôle! result2.PNG

result3.PNG

7. Bonus

7-1. Comment le rendre noir

Si vous ajoutez data-theme = dark au gars qui a g-recaptcha, il deviendra noir. Maintenant, vous pouvez le placer froidement même sur un site noir! !!

<div class="g-recaptcha" data-sitekey="6Lfx-eMUAAAAALrP774ZrvQa_AtguQhusF0M2W6s" data-theme="dark"></div>

Comme ça ↓

SS4.PNG

7-2. Comment le faire en anglais

Si vous ajoutez hl = en au paramètre GET de api.js, ce sera en anglais.

<script src="https://www.google.com/recaptcha/api.js?hl=en" async defer></script>

SS5.PNG

Cela donne une impression élégante, contrairement au japonais, qui brise les lignes à des positions étranges.

D'ailleurs, d'autres langues sont sur le guide de reCAPTCHA. Language Codes  |  reCAPTCHA  |  Google Developers

Recommended Posts

Créez "Je ne suis pas un robot" en Java EE (Jakarta EE)
Je voulais que (a == 1 && a == 2 && a == 3) vrai en Java
Faites un blackjack avec Java
[Mémo personnel] Créez une copie complète simple avec Java
Faisons un robot! "Une simple démo de Java AWT Robot"
J'ai essayé de créer une fonction de connexion avec Java
Refactoring: faire du Blackjack en Java
Rechercher un sous-ensemble en Java
[Java] Rendez-le constant
Faire un diamant en utilisant Java
Faisons une application de calcul avec Java ~ Afficher la fenêtre de l'application
Je voulais juste créer une propriété réactive en Java
J'ai créé un client RESAS-API en Java
3 Implémentez un interpréteur simple en Java
J'ai créé un PDF avec Java.
Comment créer un conteneur Java
[Java] N'utilisez pas "+" dans append!
Un exemple simple de rappels en Java
Je ne suis pas sûr de Java Servlet
Le calendrier Java n'est pas un singleton.
Faire un appel SOAP en C #
Restez coincé dans un Java Primer
Java EE 8 (Jakarta EE 8) Résumé des nouvelles fonctionnalités
Comment créer un tableau Java
[JAVA] Project Euler, je suis resté coincé au Q8, alors prenez note
Je souhaite créer un SNS Web sombre avec Jakarta EE 8 avec Java 11
J'ai essayé de créer une application de conversation en Java à l'aide de l'IA «A3RT»
A propos du renvoi d'une référence dans un Java Getter
Qu'est-ce qu'une classe en langage Java (3 /?)
Comment créer un résumé de calendrier Java
Lors de la recherche de plusieurs dans un tableau Java
Facile à créer Slack Bot avec Java
[Création] Un mémorandum sur le codage en Java
Java crée un tableau dans un document Word
Java crée un graphique circulaire dans Excel
Qu'est-ce qu'une classe en langage Java (1 /?)
Comment créer un robot Discord (Java)
Qu'est-ce qu'une classe en langage Java (2 /?)
Créer une application TODO dans Java 7 Créer un en-tête
Créons une application de calcul avec Java
Implémenter quelque chose comme une pile en Java
Diviser une chaîne avec ". (Dot)" en Java
Création d'une classe de matrice dans Java Partie 1
[Java] Créons une bibliothèque d'accès à la base de données!
Ne déclarez pas de variables dans List en Java
Faisons une application de calculatrice avec Java ~ Créez une zone d'affichage dans la fenêtre
La cause n'est pas visible lors de l'appel de méthodes d'autres classes en java
J'ai créé un programme de jugement des nombres premiers en Java
GetInstance () à partir d'une classe @Singleton dans Groovy à partir de Java
Deux façons de démarrer un thread en Java + @
Lire une chaîne dans un fichier PDF avec Java
Créer un CSR avec des informations étendues en Java
Une histoire sur le JDK à l'ère de Java 11
Comment afficher une page Web en Java
[Android / Java] Exploitez une base de données locale dans la salle
Mesurer la taille d'un dossier avec Java
Code pour échapper aux chaînes JSON en Java
Je l'ai fait en Java pour toujours rendre (a == 1 && a == 2 && a == 3) vrai
Essayez de créer un babillard en Java
La solution pour NetBeans 8.2 ne fonctionne pas dans l'environnement Java 9
Une note quand vous voulez Tuple en Java