Inspiré sur recaptcha
composer require usarise/turnstile
composer require symfony/http-client nyholm/psr7 usarise/turnstile
<?php
declare (strict_types= 1 );
require_once __DIR__ . ' /vendor/autoload.php ' ;
use Symfony Component HttpClient Psr18Client ;
use Turnstile Error Code ;
use Turnstile Turnstile ;
// Get real API keys at https://dash.cloudflare.com/?to=/:account/turnstile
$ siteKey = ' 1x00000000000000000000AA ' ; // Always passes (Dummy Testing)
$ secretKey = ' 1x0000000000000000000000000000000AA ' ; // Always passes (Dummy Testing)
if ( $ token = $ _POST [ ' cf-turnstile-response ' ] ?? null ) {
$ turnstile = new Turnstile (
client: new Psr18Client (),
secretKey: $ secretKey ,
);
$ response = $ turnstile -> verify (
$ token , // The response provided by the Turnstile client-side render on your site.
$ _SERVER [ ' REMOTE_ADDR ' ], // With usage CloudFlare: $_SERVER['HTTP_CF_CONNECTING_IP']
);
if ( $ response -> success ) {
echo ' Success! ' ;
} else {
$ errors = $ response -> errorCodes ;
var_dump ( $ errors );
var_dump (Code:: toDescription ( $ errors ));
}
exit ;
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Turnstile example</title>
<script src="https://challenges.cloudflare.com/turnstile/v0/api.js" async defer></script>
</head>
<body>
<form action="" method="POST">
<!-- The following line controls and configures the Turnstile widget. -->
<div class="cf-turnstile" data-sitekey=" <?php echo $ siteKey ; ?> " data-theme="light"></div>
<!-- end. -->
<button type="submit" value="Submit">Verify</button>
</form>
</body>
</html> var_dump (( string ) $ response ); var_dump ( $ response -> toArray ()); var_dump ( $ response -> toArray (strict: true ));Turnstile d'utilisation use Turnstile Client Client ;
use Turnstile Turnstile ;
$ turnstile = new Turnstile (
client: new Client (...),
secretKey: ' secret key ' ,
idempotencyKey: ' idempotency key ' ,
); Des clients PSR-18 comme php-http/discovery
$ turnstile = new Turnstile (
client: new Psr18Client (),
secretKey: ' secret key ' ,
idempotencyKey: ' idempotency key ' ,
);Client d'utilisation use Turnstile Client Client ;
use Turnstile TurnstileInterface ;
$ client = new Client (
client: ..., // implementation PsrHttpClientClientInterface
requestFactory: ..., // implementation PsrHttpMessageRequestFactoryInterface (default: requestFactory = client)
streamFactory: ..., // implementation PsrHttpMessageStreamFactoryInterface (default: streamFactory = requestFactory)
siteVerifyUrl: TurnstileInterface:: SITE_VERIFY_URL , // https://challenges.cloudflare.com/turnstile/v0/siteverify (default)
); composer require guzzlehttp/guzzle
use GuzzleHttp Client as GuzzleHttpClient ;
use GuzzleHttp Psr7 HttpFactory ;
use Turnstile Client Client ;
$ client = new Client (
new GuzzleHttpClient (),
new HttpFactory (),
); composer require symfony/http-client nyholm/psr7
use Symfony Component HttpClient Psr18Client ;
use Turnstile Client Client ;
$ client = new Client (
new Psr18Client (),
); use Symfony Component HttpClient Psr18Client ;
$ client = new Psr18Client (); composer require symfony/http-client guzzlehttp/psr7
use GuzzleHttp Psr7 HttpFactory ;
use Symfony Component HttpClient Psr18Client ;
use Turnstile Client Client ;
$ client = new Client (
new Psr18Client (
responseFactory: new HttpFactory (),
),
); use GuzzleHttp Psr7 HttpFactory ;
use Symfony Component HttpClient Psr18Client ;
$ client = new Psr18Client (
responseFactory: new HttpFactory (),
); composer require symfony/http-client guzzlehttp/psr7 php-http/discovery
use Symfony Component HttpClient Psr18Client ;
use Turnstile Client Client ;
$ client = new Client (
new Psr18Client (),
); use Symfony Component HttpClient Psr18Client ;
$ client = new Psr18Client (); composer require nyholm/psr7 php-http/curl-client
use Http Client Curl Client as CurlClient ;
use Nyholm Psr7 Factory Psr17Factory ;
use Turnstile Client Client ;
$ psr17Factory = new Psr17Factory ();
$ client = new Client (
client: new CurlClient (
responseFactory: $ psr17Factory ,
streamFactory: $ psr17Factory ,
),
requestFactory: $ psr17Factory ,
); composer require php-http/discovery
use Http Discovery Psr18Client ;
use Turnstile Client Client ;
$ client = new Client (
new Psr18Client (),
); use Http Discovery Psr18Client ;
$ client = new Psr18Client ();La clé secrète du widget. La touche secrète se trouve dans les paramètres du widget dans le tableau de bord CloudFlare sous Turnique.
Keys API à https://dash.cloudflare.com/?to=/:Account/turnstile
1x0000000000000000000000000000000AA PASSES TOUJOURS
2x0000000000000000000000000000000AA échoue toujours
3x0000000000000000000000000000000AA donne une erreur «Token déjà dépensée»
use Turnstile Client Client ;
use Turnstile Turnstile ;
// Real API keys at https://dash.cloudflare.com/?to=/:account/turnstile
$ secretKey = ' 1x0000000000000000000000000000000AA ' ;
$ turnstile = new Turnstile (
client: $ client ,
secretKey: $ secretKey ,
);Si une application nécessite de réessayer les demandes échouées, elle doit utiliser la fonctionnalité d'idémpotence.
Vous pouvez le faire en fournissant un UUID comme paramètre idempotencyKey , puis en utilisant $turnstile->verify(...) avec le même jeton le nombre de fois requis.
composer require ramsey/uuid
use Ramsey Uuid Uuid ;
use Turnstile Client Client ;
use Turnstile Turnstile ;
$ turnstile = new Turnstile (
client: $ client ,
secretKey: $ secretKey , // The site’s secret key.
idempotencyKey: ( string ) Uuid:: uuid4 (), // The UUID to be associated with the response.
);
$ response = $ turnstile -> verify (
$ token , // The response that will be associated with the UUID (idempotencyKey)
);
if ( $ response -> success ) {
// ...
}
$ response = $ turnstile -> verify (
$ token , // The response associated with UUID (idempotencyKey)
);
if ( $ response -> success ) {
// ...
} $ response = $ turnstile -> verify (
token: $ _POST [ ' cf-turnstile-response ' ], // The response provided by the Turnstile client-side render on your site.
); Le paramètre remoteIp aide à prévenir les abus en veillant à ce que le visiteur actuel soit celui qui a reçu le jeton.
Ce n'est actuellement pas strictement validé.
$ response = $ turnstile -> verify (
token: $ _POST [ ' cf-turnstile-response ' ], // The response provided by the Turnstile client-side render on your site.
remoteIp: $ _SERVER [ ' REMOTE_ADDR ' ], // The visitor’s IP address.
); $ response = $ turnstile -> verify (
token: $ _POST [ ' cf-turnstile-response ' ], // The response provided by the Turnstile client-side render on your site.
remoteIp: $ _SERVER [ ' HTTP_CF_CONNECTING_IP ' ], // The visitor’s IP address.
); $ response = $ turnstile -> verify (
...
challengeTimeout: 300 , // Number of allowed seconds after the challenge was solved.
expectedHostname: $ _SERVER [ ' SERVER_NAME ' ], // Expected hostname for which the challenge was served.
expectedAction: ' login ' , // Expected customer widget identifier passed to the widget on the client side.
expectedCdata: ' sessionid-123456789 ' , // Expected customer data passed to the widget on the client side.
); $ response -> success $ response -> errorCodes $ response -> challengeTs $ response -> hostname $ response -> action $ response -> cdata Chaîne avec des données JSON brutes
( string ) $ response Données JSON décodées
$ response -> toArray () Tableau de données JSON traitées basées sur les propriétés de la classe Response : success , errorCodes , challengeTs , hostname , action , cdata
$ response -> toArray (strict: true )Convertir les codes d'erreur en une description dans une langue appropriée (anglais par défaut)
use Turnstile Error { Code , Description };
var_dump (
Code:: toDescription (
codes: $ response -> errorCodes ,
descriptions: Description:: TEXTS , // Default
),
);