如何使用 PHP 对 Google Cloud Services 中的服务帐户进行身份验证?

Vae*_*tus 2 php recaptcha google-cloud-platform

在开发 Recaptcha Enterprise 以使用 V2“我不是机器人”复选框时,我遇到了以下错误:

致命错误:未捕获域异常:无法加载默认凭据。浏览至https://developers.google.com/accounts/docs/application-default-credentials了解更多信息

我点击链接并决定进行身份验证:

use Google\Cloud\Storage\StorageClient;

$storage = new StorageClient([
  'keyFile' => json_decode(file_get_contents($path_to_keyfile), true),
  'projectId' => 'MY_PROJECT'
]);
Run Code Online (Sandbox Code Playgroud)

我找不到任何其他内容表明我需要做更多事情,并且此构造函数 API 的链接并不表明我可以将其作为参数传递,然后继续。我不想在这个项目中使用环境变量,我想在代码中手动连接。我缺少什么?我可以确认我有一个可用的服务帐户。

如果有帮助,我可能在进行身份验证后尝试运行的代码是这样的:

// ==================== CAPTCHA ===================
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;

$captcha_response = $_POST['g-recaptcha-response'];
$site_key = "123456789abc";

$client = new RecaptchaEnterpriseServiceClient();

define('SITE_KEY', $site_key);
define('TOKEN', $captcha_response);
define('PROTECTED_ACTION', 'signup');
define('PARENT_PROJECT', 'projects/MY_PROJECT');

$event = (new Event())
     ->setSiteKey(SITE_KEY)
     ->setExpectedAction(PROTECTED_ACTION)
     ->setToken(TOKEN);

 $assessment = (new Assessment())
     ->setEvent($event);

 try {
     $response = $client->createAssessment(
         PARENT_PROJECT,
         $assessment
     );

     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 {
         if ($response->getEvent()->getExpectedAction() == PROTECTED_ACTION) {
             printf('The score for the protection action is:');
             printf($response->getRiskAnalysis()->getScore());
         }
         else
         {
             printf('The action attribute in your reCAPTCHA tag does not match the action you are expecting to score');
         }
     }
 } catch (exception $e) {
     printf('CreateAssessment() call failed with the following error: ');
     printf($e);
 }
Run Code Online (Sandbox Code Playgroud)

Vae*_*tus 5

这是我如何让它发挥作用的。感谢约翰·汉利在之前的回答中提供的帮助。文档让我相信(无论出于何种原因)需要存储,但事实并非如此:它就像通过参数提供密钥的路径一样简单credentials不是参数keyFile

if (empty($_POST['g-recaptcha-response']))
die("You have failed the not-a-robot check.");

$captcha_response = $_POST['g-recaptcha-response'];

require 'composer/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;

$path_to_keyfile = "MY_PROJECT-1234567890abc.json";
$site_key = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";

$client = new RecaptchaEnterpriseServiceClient([
  'credentials' => $path_to_keyfile,
  'projectId' => 'MY_PROJECT'
]);

define('SITE_KEY', $site_key);
define('TOKEN', $captcha_response);
define('PROTECTED_ACTION', 'signup');
define('PARENT_PROJECT', 'projects/MY_PROJECT');

$event = (new Event())
     ->setSiteKey(SITE_KEY)
     ->setExpectedAction(PROTECTED_ACTION)
     ->setToken(TOKEN);

 $assessment = (new Assessment())
     ->setEvent($event);

 try {
     $response = $client->createAssessment(PARENT_PROJECT, $assessment);

     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()));
         exit;
     } else {
         if ($response->getEvent()->getExpectedAction() == PROTECTED_ACTION) {
          // Closer to 1 = human, to 0 = robot.
          $bot_score = $response->getRiskAnalysis()->getScore();
          // do what you want with the score here...

         } else {
             die('The action attribute in your reCAPTCHA tag does not match the action you are expecting to score');
         }
     }
 } catch (exception $e) {
     printf('CreateAssessment() call failed with the following error: ');
     printf($e);
     exit;
 }
Run Code Online (Sandbox Code Playgroud)