Esta página explica como criar uma avaliação para permitir que o back-end verifique a autenticidade do token que o reCAPTCHA envia. O reCAPTCHA envia uma resposta criptografada, o token de resposta reCAPTCHA (token), quando o usuário final aciona uma ação.
Você precisa criar
uma avaliação para conferir os resultados de execute()
no seu back-end enviando o token gerado para
endpoint de avaliação.
O reCAPTCHA processa o
token enviado e informa a validade e a pontuação dele.
As primeiras 10.000 avaliações mensais do reCAPTCHA são gratuitos. Para continuar criando avaliações depois de atingir o limite de uso mensal gratuito (10.000 avaliações por mês), é necessário ativar o faturamento do seu projeto do Google Cloud. Para mais informações sobre faturamento, para reCAPTCHA, consulte Informações de faturamento.
Antes de começar
- Prepare seu ambiente para o reCAPTCHA.
- Verifique se você tem o seguinte papel do Identity and Access Management:
Agente do reCAPTCHA Enterprise (
roles/recaptchaenterprise.agent
). - Instale chaves baseadas em pontuação no seu aplicativo iOS ou no seu aplicativo Android.
-
Configure a autenticação no reCAPTCHA.
O método de autenticação escolhido depende do ambiente em que o reCAPTCHA está configurado. A tabela a seguir ajuda você a escolher o método de autenticação apropriado e a interface suportada para configurar autenticação:
Ambiente Interface Método de autenticação Google Cloud - REST
- Bibliotecas de cliente
Use contas de serviço anexadas. No local ou em outro provedor de nuvem REST Use as chaves de API ou a federação de identidade da carga de trabalho. Se você quiser usar chaves de API, recomendamos proteger as chaves de API aplicando restrições.
Bibliotecas de cliente Use o seguinte:
- Para Python ou Java, use chaves de API ou a federação de identidade da carga de trabalho.
Se você quiser usar chaves de API, recomendamos proteger as chaves de API aplicando restrições.
- Para outros idiomas, use a federação de identidade da carga de trabalho.
Extrair um token
Extraia um token da resposta da chamada execute()
.
É possível acessar o token de cada usuário apenas uma vez.
Se você precisar avaliar uma ação subsequente realizada por um usuário no seu aplicativo para dispositivos móveis ou se um token expirar antes de criar uma avaliação, será necessário chamar execute()
novamente para gerar um novo token.
Criar uma avaliação
Depois de configurar a autenticação, crie uma avaliação enviando uma solicitação à API reCAPTCHA Enterprise ou usando as bibliotecas de cliente do reCAPTCHA.
Para melhorar a detecção, recomendamos que você passe os seguintes valores adicionais ao criar avaliações:
userAgent
: o user agent é incluído na solicitação HTTP no cabeçalho da solicitação. Para mais informações, consulte Saiba mais sobre o cabeçalho de solicitaçãoUser-Agent
na documentação do Mozilla Developer Network.userIpAddress
: o endereço IP do usuário que envia uma solicitação ao seu back-end está disponível na solicitação HTTP. Se você usar um servidor proxy, o endereço IP estará disponível no cabeçalho de solicitaçãoX-Forwarded-For
. Para mais informações sobre como receber o endereço IP, consulteX-Forwarded-For
.ja3
: o JA3 é um método de código aberto para impressão digital em clientes TLS. Para mais informações sobre como usar o JA3 para criar uma impressão digital TLS, consulte a documentação do JA3, .
Isso ajuda a proteger seu site e aplicativos para dispositivos móveis contra padrões de ataque avançados e abuso feito por pessoas.
API REST
Para criar uma avaliação, envie uma solicitação para a API reCAPTCHA. É possível usar a CLI gcloud ou a chave de API para autenticação.
Usar a CLI gcloud
Crie uma avaliação usando o método projects.assessments.create
. Envie a solicitação para o endpoint da API v1
.
Antes de usar os dados da solicitação abaixo, faça as substituições a seguir:
- PROJECT_ID: é o ID do projeto do Google Cloud.
- TOKEN: token retornado da chamada
grecaptcha.enterprise.execute()
- KEY_ID: a chave reCAPTCHA associada ao site ou app. Para mais informações, consulte Chaves reCAPTCHA.
- USER_AGENT: o user agent na solicitação do dispositivo do usuário.
- USER_IP_ADDRESS: o endereço IP na solicitação do dispositivo do usuário.
- JA3: impressão digital JA3 para o cliente SSL. Recomendamos o uso de salesforce/ja3 para calcular o JA3.
- USER_ACTION: a ação iniciada pelo usuário que você especificou para
action
na chamadagrecaptcha.enterprise.execute()
, comologin
.Para mais informações, consulte Nomes de ação.
Método HTTP e URL:
POST https://recaptchaenterprise.googleapis.com/v1/projects/PROJECT_ID/assessments
Corpo JSON da solicitação:
{ "event": { "token": "TOKEN", "siteKey": "KEY_ID", "userAgent": "USER_AGENT", "userIpAddress": "USER_IP_ADDRESS", "ja3": "JA3", "expectedAction": "USER_ACTION" } }
Para enviar a solicitação, escolha uma destas opções:
curl
Salve o corpo da solicitação em um arquivo com o nome request.json
e execute o comando a seguir:
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
Salve o corpo da solicitação em um arquivo com o nome request.json
e execute o comando a seguir:
$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
Você receberá uma resposta JSON semelhante a esta:
{ "tokenProperties": { "valid": true, "com.example.app" or "iosBundleId": "com.example.app", "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" }
Recomendamos o uso de qualquer analisador JSON no modo de análise não restrito para evitar interrupções caso outros campos sejam introduzidos na resposta JSON.
Usar uma chave de API
Crie uma avaliação usando o método projects.assessments.create
. Envie a solicitação para o endpoint da API v1
.
Antes de usar os dados da solicitação abaixo, faça as substituições a seguir:
- API_KEY: chave de API associada ao projeto atual
- PROJECT_ID: é o ID do projeto do Google Cloud.
- TOKEN: token retornado da chamada
grecaptcha.enterprise.execute()
- KEY_ID: a chave reCAPTCHA associada ao site ou app. Para mais informações, consulte chaves reCAPTCHA.
- USER_AGENT: o user agent na solicitação do dispositivo do usuário.
- USER_IP_ADDRESS: o endereço IP na solicitação do dispositivo do usuário.
- JA3: impressão digital JA3 para o cliente SSL. Recomendamos o uso do salesforce/ja3 para computar o JA3.
- USER_ACTION: a ação iniciada pelo usuário que você especificou para
action
na chamadagrecaptcha.enterprise.execute()
, comologin
.Para mais informações, consulte Nomes de ação.
Método HTTP e URL:
POST https://recaptchaenterprise.googleapis.com/v1/projects/PROJECT_ID/assessments?key=API_KEY
Corpo JSON da solicitação:
{ "event": { "token": "TOKEN", "siteKey": "KEY_ID", "userAgent": "USER_AGENT", "userIpAddress": "USER_IP_ADDRESS", "ja3": "JA3", "expectedAction": "USER_ACTION" } }
Para enviar a solicitação, escolha uma destas opções:
curl
Salve o corpo da solicitação em um arquivo com o nome request.json
e execute o comando a seguir:
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
Salve o corpo da solicitação em um arquivo com o nome request.json
e execute o comando a seguir:
$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
Você receberá uma resposta JSON semelhante a esta:
{ "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" }
Recomendamos o uso de qualquer analisador JSON no modo de análise não restrito para evitar interrupções caso outros campos sejam introduzidos na resposta 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
A seguir
- Interprete uma avaliação e tome as medidas necessárias para seu aplicativo para dispositivos móveis com base na pontuação.