Php Google Events API返回401错误未经授权的\u客户端
我在laravel中创建了一个应用程序,当我在浏览器中运行它时,它可以将我数据库中的用户日历与一切正常工作的东西同步 但它在我的cron中返回401个未经授权的\u客户端,这两个文件中实现的代码完全相同Php Google Events API返回401错误未经授权的\u客户端,php,laravel,google-calendar-api,Php,Laravel,Google Calendar Api,我在laravel中创建了一个应用程序,当我在浏览器中运行它时,它可以将我数据库中的用户日历与一切正常工作的东西同步 但它在我的cron中返回401个未经授权的\u客户端,这两个文件中实现的代码完全相同 $client = $this->getGoogleClient(); $client->setAccessToken($accessToken); if ($client->isAccessTokenExpired()) {
$client = $this->getGoogleClient();
$client->setAccessToken($accessToken);
if ($client->isAccessTokenExpired()) {
$client->fetchAccessTokenWithRefreshToken($client->getRefreshToken());
}
$gCalService = new Google_Service_Calendar($client);
$optArr = array();
$calendarId = 'primary';
$pageToken = NULL;
$responceEvents = array();
$synced = $emailSync->getGoogleSynced();
if($synced != null)
$optArr['syncToken'] = $synced->sync_token;
do {
if ($pageToken) {
$optArr['pageToken'] = $pageToken;
}
try {
$results = $gCalService->events->listEvents($calendarId,$optArr);
}
catch (Google_Service_Exception $e) {
$msg = $e->getMessage();
return $msg;
}
if ($results->getItems()) {
$responceEvents = array_merge($responceEvents, $results->getItems());
$pageToken = $results->getNextPageToken();
}
} while ($pageToken);
$client->fetchAccessTokenWithRefreshToken($client->getRefreshToken())代码>
返回以下错误
Array
(
[error] => unauthorized_client
[error_description] => Unauthorized
)
调试的代码逐行$client->getRefreshToken()
也包含我在这里传递的值$client->setAccessToken($accessToken)代码>完全相同的代码在我的浏览器文件中工作正常,在我的cron中不工作
401未经授权的客户机
表示您的代码未经授权。如果您想访问私人用户数据,则需要登录。您的代码需要访问令牌才能访问Google api
您应该做的是在浏览器中使用Oauth2对代码进行一次授权—将刷新令牌保存到某个地方,让cron作业读取刷新令牌,并在运行之前请求新的访问令牌
假设您拥有您试图插入的帐户,也可能需要考虑使用服务帐户。
刷新令牌
如果将刷新令牌存储在数据库中,则必须先将其分配给客户机,然后再运行代码。在这里,我使用存储在会话变量中的刷新令牌执行此操作
$client->refreshToken($_SESSION['refresh_token']);
您如何验证cron作业?不需要任何授权。即使在cron中,访问私人用户数据也始终需要授权。我将所有内容都保存在数据库中相同的代码完全正常工作。我希望它正常工作,但在cron中添加该代码时,它停止工作。因为cron没有读取您的刷新令牌或正在获取新的访问令牌。让它为你写一个文件,这样你就可以看到它了。请将剩下的代码发布到$client->getRefreshToken()集合的位置?@dalmt要检查我在问题中发布的代码,我正在获取两个函数中的所有数据。你说它存储在数据库中?当代码运行时,您需要获取刷新令牌并使用它填充客户端或通过web浏览器与用户登录。刚刚调试的$client->fetchAccessTokenWithRefreshToken($client->getRefreshToken())代码>不刷新accessToken。