我已经在laravel中创建了一个应用程序来将我的数据库中的用户日历与incremental sync同步,当我在浏览器中运行时,每件事情都很完美。
但它在我的cron中返回401 unauthorized_client 100%在两个文件中实现相同的代码。
$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 unauthorized_client
表示您的代码未经授权。如果您想访问私人用户数据,则需要登录。您的代码需要访问令牌才能访问Google API。
您应该做的是在浏览器中使用Oauth2授权您的代码,在某处保存刷新令牌,让cron作业读取刷新令牌并在运行之前请求新的访问令牌。
假设您拥有您尝试插入的帐户,您可能还需要考虑使用服务帐户。
刷新令牌
如果要将刷新令牌存储在数据库中,则必须先将其分配给客户端,然后再运行代码,我将使用存储在会话变量中的刷新令牌进行操作。
$client->refreshToken($_SESSION['refresh_token']);