web-dev-qa-db-fra.com

Comment valider reCAPTCHA V2 Java (Servlet)

Ceci est un article de style Q & A, auquel je posterai à la fois la question et une réponse. La raison principale en est que j'ai passé pas mal de temps à chercher le moyen le plus simple de valider recaptcha V2. Je vais donc partager mes connaissances pour éviter davantage de perte de temps aux développeurs.

Comment faire une validation côté serveur de Google reCAPTCHA V2 ou reCAPTCHA invisible avec Java ?

3
Roshana Pitigala

J'utilise la bibliothèque org.json pour cela. Obtenez le fichier jar à partir de ici ou lisez le docs . Ajoutez le fichier jar à votre projet et importez les classes suivantes.

import Java.io.BufferedReader;
import Java.io.InputStream;
import Java.io.InputStreamReader;
import Java.net.URL;
import Java.nio.charset.Charset;
import org.json.JSONObject;

Utilisez la méthode suivante pour la validation.

/**
 * Validates Google reCAPTCHA V2 or Invisible reCAPTCHA.
 * @param secretKey Secret key (key given for communication between your site and Google)
 * @param response reCAPTCHA response from client side. (g-recaptcha-response)
 * @return true if validation successful, false otherwise.
 */
public static boolean isCaptchaValid(String secretKey, String response) {
    try {
        String url = "https://www.google.com/recaptcha/api/siteverify?"
                + "secret=" + secretKey
                + "&response=" + response;
        InputStream res = new URL(url).openStream();
        BufferedReader rd = new BufferedReader(new InputStreamReader(res, Charset.forName("UTF-8")));

        StringBuilder sb = new StringBuilder();
        int cp;
        while ((cp = rd.read()) != -1) {
            sb.append((char) cp);
        }
        String jsonText = sb.toString();
        res.close();

        JSONObject json = new JSONObject(jsonText);
        return json.getBoolean("success");
    } catch (Exception e) {
        return false;
    }
}

Appelez la méthode ci-dessus comme indiqué ci-dessous,

if(isCaptchaValid("enter_your_key_here", request.getParameter("g-recaptcha-response"))){
    //valid
}

J'espère que cela t'aides. À votre santé!

5
Roshana Pitigala

Juste pour fournir une autre variante:

import javax.inject.Inject;
import javax.validation.constraints.NotNull;
import javax.ws.rs.client.*;
import javax.ws.rs.core.*;

import org.springframework.stereotype.Component;

import com.fasterxml.jackson.databind.*;

@Component
public class ReCaptcha {

    private final WebTarget webTarget;

    public ReCaptcha() {
        webTarget = ClientBuilder.newClient()
                .target("https://www.google.com/recaptcha/api/siteverify")
                .queryParam("secret", "6LeIxAcTAAAAAGG-vFI1TnRWxMZNFuojJ4WifJWe");
    }

    public boolean isValid(@NotNull String token) throws IOException {
        Response response = this.webTarget.queryParam("response", token)
                .request(MediaType.APPLICATION_JSON)
                .accept("application/ld+json")
                .get();

        if (response.getStatus() != 200)
            return false;

        String stringResponse = response.readEntity(String.class);
        JsonNode jsonNode = new ObjectMapper().readTree(stringResponse);
        return jsonNode.get("success").asBoolean();
    }
}

En outre, vous pouvez valider le nom d'hôte et l'action renvoyés. Vous pouvez également vous connecter pour identifier les codes d'erreur renvoyés.

Vous devrez remplacer la clé d'API utilisée par la vôtre (il s'agit d'une clé d'API de test. Vous devez toujours indiquer que le jeton est valide: https://developers.google.com/recaptcha/docs/faq ) Cela pourrait également être une bonne idée de placer la clé et l'URL de l'API dans un fichier de propriétés supplémentaire.

Vous pouvez injecter cette classe partout où vous le souhaitez.

Je l'utilise avec des exceptions spéciales au lieu de retourner vrai ou faux.

0
Spen