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 错误请求的身份验证范围不足的主要内容,如果未能解决你的问题,请参考以下文章
ASP.Net - Google Calendar API V3 redirect_uri_mismatch 错误
Google Calendar API - 禁止 - 服务帐户错误
通过多封电子邮件从 google calendar api 查询事件