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

Posted

技术标签:

【中文标题】Google Calendar API 错误请求的身份验证范围不足【英文标题】:Google Calendar API error Request had insufficient authentication scopes 【发布时间】:2021-12-12 20:37:58 【问题描述】:

我正在尝试使用 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));

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

致命错误:未捕获的 Google_Service_Exception: "error": "code": 403, "message": "Request has enough authentication scopes.", "errors": [ "message": "Insufficient Permission", " domain": "global", "reason": "insufficientPermissions" ], "status": "PERMISSION_DENIED" 在 C:\xampp\htdocs\google\calendar\vendor\google\apiclient\src\Google\Http\ REST.php:118 堆栈跟踪:#0 C:\xampp\htdocs\google\calendar\vendor\google\apiclient\src\Google\Http\REST.php(94): Google_Http_REST::decodeHttpResponse(Object(GuzzleHttp\Psr7 \Response),对象(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 在 C:\xampp\htdocs\谷歌e\calendar\vendor\google\apiclient\src\Google\Http\REST.php 在第 118 行

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

大家有什么建议吗?

谢谢

【问题讨论】:

【参考方案1】:

您似乎正在尝试使用 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']。虽然您没有使用离线访问,但您可能只需等待访问令牌在一小时内过期。

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

【讨论】:

就是这样。谢谢!

以上是关于Google Calendar API 错误请求的身份验证范围不足的主要内容,如果未能解决你的问题,请参考以下文章

Google Calendar API 批量请求 PHP

ASP.Net - Google Calendar API V3 redirect_uri_mismatch 错误

Google Calendar API - 禁止 - 服务帐户错误

通过多封电子邮件从 google calendar api 查询事件

如何从 Google Calendar API 获取刷新的令牌

Google Calendar API停止了返回活动