turnstile php
Version 0.5.3
启发在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 use Turnstile Client Client ;
use Turnstile Turnstile ;
$ turnstile = new Turnstile (
client: new Client (...),
secretKey: ' secret key ' ,
idempotencyKey: ' idempotency key ' ,
);PSR-18客户,例如php-http/discovery
$ turnstile = new Turnstile (
client: new Psr18Client (),
secretKey: ' secret key ' ,
idempotencyKey: ' idempotency key ' ,
);Client 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 ();小部件的秘密钥匙。秘密键可以在旋转门下的Cloudflare仪表板中的小部件设置下找到。
API键https://dash.cloudflare.com/?to=/:account/turnstile
1x0000000000000000000000000000000AA总是通过
2x0000000000000000000000000000000AA总是失败的
3x0000000000000000000000000000000AA产生“已花费的令牌”错误
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 ,
);如果应用程序需要重试失败的请求,则必须利用IDEMPOTENCY功能。
您可以通过提供uuid作为idempotencyKey参数,然后使用$turnstile->verify(...)使用相同的标记使用所需的次数。
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.
);通过确保当前访问者是接收令牌的访问者, remoteIp参数有助于防止滥用。
目前尚未严格验证。
$ 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 带有原始JSON数据的字符串
( string ) $ response 解码的JSON数据
$ response -> toArray ()基于Response类的属性: success , errorCodes , challengeTs , hostname , action , cdata一系列处理的JSON数据数组
$ response -> toArray (strict: true )将错误代码转换为使用合适语言的描述(默认英语)
use Turnstile Error { Code , Description };
var_dump (
Code:: toDescription (
codes: $ response -> errorCodes ,
descriptions: Description:: TEXTS , // Default
),
);