OS...Windows 10 IDE...Eclipse 2020-3 Java...Open JDK 14 Conteneur de servlet ... Apache Tomcat 9.0.33
Tout d'abord, accédez au site reCAPTCHA. reCAPTCHA
Créez avec le bouton +.
Entrez les informations de votre site.
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.
Cette fois, réglez-le sur "RecaptchaTest". (Si vous l'avez déjà fait, utilisez-le.)
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! !!
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.
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 ~~~
Essayons-le!
Testez avec et sans ce contrôle!
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 ↓
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>
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