Google 日历 API 错误请求的身份验证范围不足

Google Calendar API error Request had insufficient authentication scopes

我正在尝试使用 PHP 更改 Google 日历事件的颜色。 我使用的代码是这样的:

if(version_compare(PHP_VERSION, '7.2.0', '>=')) {
error_reporting(E_ALL ^ E_NOTICE ^ E_WARNING);
}

require_once __DIR__.'/vendor/autoload.php';

$hostname = 'localhost';
$username = 'root';
$password = '';
$database = 'pacientes';

try {
    $conex = new PDO("mysql:host=$hostname;dbname=$database;charset=utf8", $username, $password,
    array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));

}
catch(PDOException $e){
    echo $e->getMessage();
}   


session_start();

$client = new Google_Client();
$client->setAuthConfig('client_secrets.json');
$client->addScope(Google_Service_Calendar::CALENDAR_READONLY);
$client->addScope("https://www.googleapis.com/auth/calendar.events");
$client->addScope("https://www.googleapis.com/auth/calendar");

if (isset($_SESSION['access_token']) && $_SESSION['access_token']) {
  $client->setAccessToken($_SESSION['access_token']);
  
$data = date("Y-m-d");
$date = date("Y-m-d", strtotime('+7 days', time()));

$status = "3";
$dados = $conex->prepare('SELECT * FROM pacientes WHERE status = ? LIMIT 1');
$dados->bindParam(1, $status);
    
     $dados->execute();
    if ($dados->rowCount() > 0) {
        
foreach($dados->fetchAll(PDO::FETCH_OBJ) as $key => $linha) {
$optParams = "".$linha->ide."";




 
  
  
  $service = new Google_Service_Calendar($client);
  $event = $service->events->get('primary', $optParams);
  


   
$event->setColorID('4');

$updatedEvent = $service->events->update('primary', $optParams, $event);

// Print the updated date.
echo $updatedEvent->getUpdated();
  
     
    
    

    

    
  }

         }
    

} else {
  $redirect_uri = 'http://' . $_SERVER['HTTP_HOST'] . '/oauth2callback.php';
  header('Location: ' . filter_var($redirect_uri, FILTER_SANITIZE_URL));
}

但是当我 运行 代码时,我得到错误:

Fatal error: Uncaught Google_Service_Exception: { "error": { "code": 403, "message": "Request had insufficient authentication scopes.", "errors": [ { "message": "Insufficient Permission", "domain": "global", "reason": "insufficientPermissions" } ], "status": "PERMISSION_DENIED" } } in C:\xampp\htdocs\google\calendar\vendor\google\apiclient\src\Google\Http\REST.php:118 Stack trace: #0 C:\xampp\htdocs\google\calendar\vendor\google\apiclient\src\Google\Http\REST.php(94): Google_Http_REST::decodeHttpResponse(Object(GuzzleHttp\Psr7\Response), Object(GuzzleHttp\Psr7\Request), 'Google\Service\...') #1 C:\xampp\htdocs\google\calendar\vendor\google\apiclient\src\Google\Task\Runner.php(181): Google_Http_REST::doExecute(Object(GuzzleHttp\Client), Object(GuzzleHttp\Psr7\Request), 'Google\Service\...') #2 C:\xampp\htdocs\google\calendar\vendor\google\apiclient\src\Google\Http\REST.php(58): Google_Task_Runner->run() #3 C:\xampp\htdocs\google\calendar\vendor\google\apiclie in C:\xampp\htdocs\google\calendar\vendor\google\apiclient\src\Google\Http\REST.php on line 118

我在 Google Cloud Platform 中重新创建了权限,确保授予编辑事件 (/auth/calendar.events) 的权限,但错误仍然存​​在。

有人有什么建议吗?

谢谢

您似乎正在尝试使用 Events: update 此方法需要以下范围之一的授权

现在,如果我们检查您的代码,我们可以看到以下内容

$client->addScope(Google_Service_Calendar::CALENDAR_READONLY);
$client->addScope("https://www.googleapis.com/auth/calendar.events");
$client->addScope("https://www.googleapis.com/auth/calendar");

您将最后两个添加为纯 HTTPS 范围名称而不是 php 客户端库提供的内部范围名称的方式。对我来说,您 运行 您的代码曾经使用 CALENDAR_READONLY 并且它没有工作并且您检查了文档并意识到您需要文档中指示的更高级别的范围。这是伟大而完美的。但是,当您再次 运行 您的代码时,您没有重置授权,因此它仍然是 运行 来自您的第一个 运行 CALENDAR_READONLY

的授权

所以解决办法就是强制你的应用重新授权。最简单的方法是进入您的 Google 帐户并重置第三方同意并为您的应用删除它 Manage third-party apps & services with access to your account 或者删除浏览器中的 cookie 也可能有效。您需要清除 $_SESSION['access_token']。虽然您没有使用离线访问,因此您可能只需等待访问令牌在一小时后过期。

您想要的是再次弹出同意屏幕并请求访问您帐户的权限,您现在应该在屏幕上看到两个新范围。