Cette page explique comment créer une évaluation pour permettre à votre backend de vérifier l'authenticité du jeton envoyé par reCAPTCHA. reCAPTCHA envoie une réponse chiffrée, le jeton de réponse reCAPTCHA (également appelé jeton), lorsque l'utilisateur final déclenche une action HTML.
Pour tout type d'intégration de clé reCAPTCHA (case à cocher ou score), vous devez créer une évaluation pour évaluer les résultats de execute()
dans votre backend en envoyant le jeton généré au point de terminaison de l'évaluation.
reCAPTCHA traite le jeton envoyé, et indique sa validité et son score.
Les 10 000 évaluations reCAPTCHA mensuelles sont gratuites. Pour continuer à créer des évaluations après avoir atteint l'abonnement mensuel gratuit limite d'utilisation (10 000 évaluations par mois), vous devez activer la facturation de votre projet Google Cloud. Pour en savoir plus sur la facturation pour reCAPTCHA, consultez Informations de facturation :
Avant de commencer
- Préparez votre environnement pour reCAPTCHA.
- Assurez-vous de disposer du rôle Identity and Access Management suivant:
Agent reCAPTCHA Enterprise (
roles/recaptchaenterprise.agent
). - Installez des clés basées sur des scores ou des clés de case à cocher sur votre site Web.
-
Configurez l'authentification auprès de reCAPTCHA.
La méthode d'authentification que vous choisissez dépend de l'environnement dans lequel reCAPTCHA est configuré. Le tableau suivant vous aide à choisir la méthode d'authentification appropriée et l'interface compatible pour configurer l'authentification :
Environnement Interface Méthode d'authentification Google Cloud - REST
- Bibliothèques clientes
Utilisez des comptes de service associés. Sur site ou auprès d'un autre fournisseur cloud REST Utilisez des clés API ou la fédération d'identité de charge de travail. Si vous souhaitez utiliser des clés API, nous vous recommandons de les sécuriser en appliquant des restrictions de clé API.
Bibliothèques clientes Utilisez les ressources suivantes :
- Pour Python ou Java, utilisez des clés API ou la fédération d'identité de charge de travail.
Si vous souhaitez utiliser des clés API, nous vous recommandons de les sécuriser en appliquant des restrictions de clé API.
- Pour les autres langages, utilisez la fédération d'identité de charge de travail.
Récupérer un jeton
Récupérez un jeton sur les pages Web de l'une des manières suivantes :
- La valeur résolue de la promesse renvoyée par l'appel à
grecaptcha.enterprise.execute()
- Utilisez le paramètre POST
g-recaptcha-response
lorsqu'un utilisateur envoie un formulaire sur votre site. - En tant qu'argument de chaîne de votre fonction de rappel si
data-callback
est spécifié dans l'attribut de balise HTMLg-recaptcha
ou le rappel dans la méthodegrecaptcha.enterprise.render
.
Vous ne pouvez accéder au jeton de chaque utilisateur qu'une seule fois.
Si vous devez évaluer une action ultérieure qu'un utilisateur entreprend sur votre site, ou si un jeton expire avant la création d'une évaluation, vous devez appeler à nouveau execute()
pour générer un nouveau jeton.
Créer une évaluation
Après avoir configuré l'authentification, créez une évaluation en envoyant une requête à l'API reCAPTCHA Enterprise ou en utilisant les bibliothèques clientes reCAPTCHA.
Pour améliorer la détection, nous vous recommandons de transmettre les valeurs supplémentaires suivantes lorsque vous créez des évaluations :
userAgent
: le user-agent est inclus dans l'en-tête de la requête HTTP. Pour en savoir plus, consultez En savoir plus sur l'en-tête de requêteUser-Agent
dans la documentation Mozilla Developer Network.userIpAddress
: l'adresse IP de l'utilisateur qui envoie une requête à votre backend est disponible dans la requête HTTP. Si vous utilisez un serveur proxy, l'adresse IP est disponible dans l'en-tête de requêteX-Forwarded-For
. Pour savoir comment obtenir l'adresse IP, consultezX-Forwarded-For
.ja3
: JA3 est une méthode Open Source permettant de récupérer les empreintes des clients TLS. Pour en savoir plus sur l'utilisation de JA3 pour créer une empreinte TLS, consultez la documentation JA3, .
Cela permet de protéger votre site Web et vos applications mobiles contre les modèles d'attaque avancés et les utilisations abusives humaines.
La procédure de création d'une évaluation est identique pour les clés basées sur des scores et les clés basées sur des cases à cocher.
API REST
Créez une évaluation en envoyant une requête à l'API reCAPTCHA. Vous pouvez utiliser la CLI gcloud ou la clé API pour l'authentification.
Utiliser la CLI gcloud
Créez une évaluation à l'aide de la méthode projects.assessments.create
. Envoyez cette requête au point de terminaison de l'API v1
.
Avant d'utiliser les données de requête ci-dessous, effectuez les remplacements suivants :
- PROJECT_ID : ID de votre projet Google Cloud
- TOKEN : jeton renvoyé par l'appel
grecaptcha.enterprise.execute()
- KEY_ID : clé reCAPTCHA associée au site ou à l'application. Pour en savoir plus, consultez la page Clés reCAPTCHA.
- USER_AGENT : user-agent dans la requête de l'appareil de l'utilisateur.
- USER_IP_ADDRESS : adresse IP de la requête provenant de l'appareil de l'utilisateur.
- JA3: empreinte JA3 du client SSL. Nous vous recommandons d'utiliser salesforce/ja3 pour calculer JA3.
- USER_ACTION: action déclenchée par l'utilisateur que vous avez spécifiée pour
action
dans l'appelgrecaptcha.enterprise.execute()
, par exemplelogin
.Pour en savoir plus, consultez la section Noms des actions.
Méthode HTTP et URL :
POST https://recaptchaenterprise.googleapis.com/v1/projects/PROJECT_ID/assessments
Corps JSON de la requête :
{ "event": { "token": "TOKEN", "siteKey": "KEY_ID", "userAgent": "USER_AGENT", "userIpAddress": "USER_IP_ADDRESS", "ja3": "JA3", "expectedAction": "USER_ACTION" } }
Pour envoyer votre requête, choisissez l'une des options suivantes :
curl
Enregistrez le corps de la requête dans un fichier nommé request.json
, puis exécutez la commande suivante :
curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://recaptchaenterprise.googleapis.com/v1/projects/PROJECT_ID/assessments"
PowerShell
Enregistrez le corps de la requête dans un fichier nommé request.json
, puis exécutez la commande suivante :
$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }
Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://recaptchaenterprise.googleapis.com/v1/projects/PROJECT_ID/assessments" | Select-Object -Expand Content
Vous devriez recevoir une réponse JSON de ce type :
{ "tokenProperties": { "valid": true, "hostname": "www.google.com", "action": "homepage", "createTime": "2019-03-28T12:24:17.894Z" }, "riskAnalysis": { "score": 0.1, "reasons": ["AUTOMATION"] }, "event": { "token": "TOKEN", "siteKey": "KEY_ID", "userAgent": "USER_AGENT", "userIpAddress": "USER_IP_ADDRESS", "ja3": "JA3", "expectedAction": "USER_ACTION" }, "name": "projects/PROJECT_NUMBER/assessments/b6ac310000000000" }
Nous vous recommandons d'utiliser des analyseurs JSON en mode d'analyse non stricte pour éviter toute interruption si des champs supplémentaires sont ajoutés à la réponse JSON.
Utiliser une clé API
Créez une évaluation à l'aide de la méthode projects.assessments.create
. Envoyez cette requête au point de terminaison de l'API v1
.
Avant d'utiliser les données de requête ci-dessous, effectuez les remplacements suivants :
- API_KEY : clé API associée au projet en cours
- PROJECT_ID : ID de votre projet Google Cloud
- TOKEN : jeton renvoyé par l'appel
grecaptcha.enterprise.execute()
- KEY_ID : clé reCAPTCHA associée au site ou à l'application. Pour en savoir plus, consultez la page Clés reCAPTCHA.
- USER_AGENT : user-agent dans la requête de l'appareil de l'utilisateur.
- USER_IP_ADDRESS : adresse IP de la requête provenant de l'appareil de l'utilisateur.
- JA3: empreinte JA3 du client SSL. Nous vous recommandons d'utiliser salesforce/ja3 pour calculer JA3.
- USER_ACTION : action initiée par l'utilisateur que vous avez spécifiée pour
action
dans l'appelgrecaptcha.enterprise.execute()
, telle quelogin
.Pour plus d'informations, consultez la section Noms des actions.
Méthode HTTP et URL :
POST https://recaptchaenterprise.googleapis.com/v1/projects/PROJECT_ID/assessments?key=API_KEY
Corps JSON de la requête :
{ "event": { "token": "TOKEN", "siteKey": "KEY_ID", "userAgent": "USER_AGENT", "userIpAddress": "USER_IP_ADDRESS", "ja3": "JA3", "expectedAction": "USER_ACTION" } }
Pour envoyer votre requête, choisissez l'une des options suivantes :
curl
Enregistrez le corps de la requête dans un fichier nommé request.json
, puis exécutez la commande suivante :
curl -X POST \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://recaptchaenterprise.googleapis.com/v1/projects/PROJECT_ID/assessments?key=API_KEY"
PowerShell
Enregistrez le corps de la requête dans un fichier nommé request.json
, puis exécutez la commande suivante :
$headers = @{ }
Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://recaptchaenterprise.googleapis.com/v1/projects/PROJECT_ID/assessments?key=API_KEY" | Select-Object -Expand Content
Vous devriez recevoir une réponse JSON de ce type :
{ "tokenProperties": { "valid": true, "hostname": "www.google.com", "action": "homepage", "createTime": "2019-03-28T12:24:17.894Z" }, "riskAnalysis": { "score": 0.1, "reasons": ["AUTOMATION"] }, "event": { "token": "TOKEN", "siteKey": "KEY_ID", "userAgent": "USER_AGENT", "userIpAddress": "USER_IP_ADDRESS", "ja3": "JA3", "expectedAction": "USER_ACTION" }, "name": "projects/PROJECT_NUMBER/assessments/b6ac310000000000" }
Nous vous recommandons d'utiliser des analyseurs JSON en mode d'analyse non stricte pour éviter toute interruption si des champs supplémentaires sont ajoutés à la réponse JSON.
C#
using System; using Google.Api.Gax.ResourceNames; using Google.Cloud.RecaptchaEnterprise.V1; public class CreateAssessmentSample { // Create an assessment to analyze the risk of a UI action. // projectID: Google Cloud project ID. // recaptchaKey: reCAPTCHA key obtained by registering a domain or an app to use reCAPTCHA Enterprise. // token: The token obtained from the client on passing the recaptchaKey. // recaptchaAction: Action name corresponding to the token. public void createAssessment(string projectID = "project-id", string recaptchaKey = "recaptcha-key", string token = "action-token", string recaptchaAction = "action-name") { // Create the client. // TODO: To avoid memory issues, move this client generation outside // of this example, and cache it (recommended) or call client.close() // before exiting this method. RecaptchaEnterpriseServiceClient client = RecaptchaEnterpriseServiceClient.Create(); ProjectName projectName = new ProjectName(projectID); // Build the assessment request. CreateAssessmentRequest createAssessmentRequest = new CreateAssessmentRequest() { Assessment = new Assessment() { // Set the properties of the event to be tracked. Event = new Event() { SiteKey = recaptchaKey, Token = token, ExpectedAction = recaptchaAction }, }, ParentAsProjectName = projectName }; Assessment response = client.CreateAssessment(createAssessmentRequest); // Check if the token is valid. if (response.TokenProperties.Valid == false) { System.Console.WriteLine("The CreateAssessment call failed because the token was: " + response.TokenProperties.InvalidReason.ToString()); return; } // Check if the expected action was executed. if (response.TokenProperties.Action != recaptchaAction) { System.Console.WriteLine("The action attribute in reCAPTCHA tag is: " + response.TokenProperties.Action.ToString()); System.Console.WriteLine("The action attribute in the reCAPTCHA tag does not " + "match the action you are expecting to score"); return; } // Get the risk score and the reasons. // For more information on interpreting the assessment, // see: https://cloud.google.com/recaptcha/docs/interpret-assessment System.Console.WriteLine("The reCAPTCHA score is: " + ((decimal)response.RiskAnalysis.Score)); foreach (RiskAnalysis.Types.ClassificationReason reason in response.RiskAnalysis.Reasons) { System.Console.WriteLine(reason.ToString()); } } public static void Main(string[] args) { new CreateAssessmentSample().createAssessment(); } }
Go
import ( "context" "fmt" recaptcha "cloud.google.com/go/recaptchaenterprise/v2/apiv1" recaptchapb "cloud.google.com/go/recaptchaenterprise/v2/apiv1/recaptchaenterprisepb" ) func main() { // TODO(developer): Replace these variables before running the sample. projectID := "project-id" recaptchaKey := "recaptcha-key" token := "action-token" recaptchaAction := "action-name" createAssessment(projectID, recaptchaKey, token, recaptchaAction) } /** * Create an assessment to analyze the risk of a UI action. * * @param projectID: Google Cloud project ID * @param recaptchaKey: reCAPTCHA key obtained by registering a domain or an app to use the services of reCAPTCHA Enterprise. * @param token: The token obtained from the client on passing the recaptchaKey. * @param recaptchaAction: Action name corresponding to the token. */ func createAssessment(projectID string, recaptchaKey string, token string, recaptchaAction string) { // Create the recaptcha client. // TODO: To avoid memory issues, move this client generation outside // of this example, and cache it (recommended) or call client.close() // before exiting this method. ctx := context.Background() client, err := recaptcha.NewClient(ctx) if err != nil { fmt.Printf("Error creating reCAPTCHA client\n") } defer client.Close() // Set the properties of the event to be tracked. event := &recaptchapb.Event{ Token: token, SiteKey: recaptchaKey, } assessment := &recaptchapb.Assessment{ Event: event, } // Build the assessment request. request := &recaptchapb.CreateAssessmentRequest{ Assessment: assessment, Parent: fmt.Sprintf("projects/%s", projectID), } response, err := client.CreateAssessment( ctx, request) if err != nil { fmt.Printf("%v", err.Error()) } // Check if the token is valid. if response.TokenProperties.Valid == false { fmt.Printf("The CreateAssessment() call failed because the token"+ " was invalid for the following reasons: %v", response.TokenProperties.InvalidReason) return } // Check if the expected action was executed. if response.TokenProperties.Action == recaptchaAction { // Get the risk score and the reason(s). // For more information on interpreting the assessment, // see: https://cloud.google.com/recaptcha/docs/interpret-assessment fmt.Printf("The reCAPTCHA score for this token is: %v", response.RiskAnalysis.Score) for _,reason := range response.RiskAnalysis.Reasons { fmt.Printf(reason.String()+"\n") } return } fmt.Printf("The action attribute in your reCAPTCHA tag does " + "not match the action you are expecting to score") }
Java
Node.js
const {RecaptchaEnterpriseServiceClient} = require('@google-cloud/recaptcha-enterprise'); /** * Create an assessment to analyze the risk of a UI action. Note that * this example does set error boundaries and returns `null` for * exceptions. * * projectID: Google Cloud project ID * recaptchaKey: reCAPTCHA key obtained by registering a domain or an app to use the services of reCAPTCHA Enterprise. * token: The token obtained from the client on passing the recaptchaKey. * recaptchaAction: Action name corresponding to the token. * userIpAddress: The IP address of the user sending a request to your backend is available in the HTTP request. * userAgent: The user agent is included in the HTTP request in the request header. * ja3: JA3 associated with the request. */ async function createAssessment({ projectID = "your-project-id", recaptchaKey = "your-recaptcha-key", token = "action-token", recaptchaAction = "action-name", userIpAddress = "user-ip-address", userAgent = "user-agent", ja3 = "ja3" }) { // Create the reCAPTCHA client & set the project path. There are multiple // ways to authenticate your client. For more information see: // https://cloud.google.com/docs/authentication // TODO: To avoid memory issues, move this client generation outside // of this example, and cache it (recommended) or call client.close() // before exiting this method. const client = new RecaptchaEnterpriseServiceClient(); const projectPath = client.projectPath(projectID); // Build the assessment request. const request = ({ assessment: { event: { token: token, siteKey: recaptchaKey, userIpAddress: userIpAddress, userAgent: userAgent, ja3: ja3, }, }, parent: projectPath, }); // client.createAssessment() can return a Promise or take a Callback const [ response ] = await client.createAssessment(request); // Check if the token is valid. if (!response.tokenProperties.valid) { console.log("The CreateAssessment call failed because the token was: " + response.tokenProperties.invalidReason); return null; } // Check if the expected action was executed. // The `action` property is set by user client in the // grecaptcha.enterprise.execute() method. if (response.tokenProperties.action === recaptchaAction) { // Get the risk score and the reason(s). // For more information on interpreting the assessment, // see: https://cloud.google.com/recaptcha/docs/interpret-assessment console.log("The reCAPTCHA score is: " + response.riskAnalysis.score); response.riskAnalysis.reasons.forEach((reason) => { console.log(reason); }); return response.riskAnalysis.score; } else { console.log("The action attribute in your reCAPTCHA tag " + "does not match the action you are expecting to score"); return null; } }
PHP
<?php // Include Google Cloud dependencies using Composer // composer require google/cloud-recaptcha-enterprise require 'vendor/autoload.php'; use Google\Cloud\RecaptchaEnterprise\V1\RecaptchaEnterpriseServiceClient; use Google\Cloud\RecaptchaEnterprise\V1\Event; use Google\Cloud\RecaptchaEnterprise\V1\Assessment; use Google\Cloud\RecaptchaEnterprise\V1\TokenProperties\InvalidReason; /** * Create an assessment to analyze the risk of a UI action. * @param string $siteKey The key ID for the reCAPTCHA key (See https://cloud.google.com/recaptcha/docs/create-key) * @param string $token The user's response token for which you want to receive a reCAPTCHA score. (See https://cloud.google.com/recaptcha/docs/create-assessment#retrieve_token) * @param string $project Your Google Cloud project ID */ function create_assessment( string $siteKey, string $token, string $project ): void { // TODO: To avoid memory issues, move this client generation outside // of this example, and cache it (recommended) or call client.close() // before exiting this method. $client = new RecaptchaEnterpriseServiceClient(); $projectName = $client->projectName($project); $event = (new Event()) ->setSiteKey($siteKey) ->setToken($token); $assessment = (new Assessment()) ->setEvent($event); try { $response = $client->createAssessment( $projectName, $assessment ); // You can use the score only if the assessment is valid, // In case of failures like re-submitting the same token, getValid() will return false if ($response->getTokenProperties()->getValid() == false) { printf('The CreateAssessment() call failed because the token was invalid for the following reason: '); printf(InvalidReason::name($response->getTokenProperties()->getInvalidReason())); } else { printf('The score for the protection action is:'); printf($response->getRiskAnalysis()->getScore()); // Optional: You can use the following methods to get more data about the token // Action name provided at token generation. // printf($response->getTokenProperties()->getAction() . PHP_EOL); // The timestamp corresponding to the generation of the token. // printf($response->getTokenProperties()->getCreateTime()->getSeconds() . PHP_EOL); // The hostname of the page on which the token was generated. // printf($response->getTokenProperties()->getHostname() . PHP_EOL); } } catch (exception $e) { printf('CreateAssessment() call failed with the following error: '); printf($e); } } // TODO(Developer): Replace the following before running the sample create_assessment( 'YOUR_RECAPTCHA_KEY', 'YOUR_USER_RESPONSE_TOKEN', 'YOUR_GOOGLE_CLOUD_PROJECT_ID' ); ?>
Python
Ruby
Étape suivante
- Interprétez une évaluation et prenez les mesures appropriées pour votre site en fonction du score.