我已经在laravel中创建了一个应用程序,以使我在数据库中的用户日历与incremental sync同步,当我在浏览器中运行它时,一切运行正常。
但是在我的cron中返回的401未经授权的客户端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中无法工作的代码完全相同。
答案 0 :(得分:0)
401未经授权的客户端
表示您的代码尚未获得授权。如果要访问私人用户数据,则需要登录。您的代码需要访问令牌才能访问Google api。
您应该做的是在浏览器中使用Oauth2对代码进行一次授权,将刷新令牌保存在某个位置,并让cron作业读取刷新令牌并在运行之前请求新的访问令牌。
假设您拥有尝试插入的帐户,那么您可能还需要考虑使用服务帐户。
刷新令牌
如果要将刷新令牌存储在数据库中,则必须先将其分配给客户端,然后再在此处运行代码,我这样做是将刷新令牌存储在会话变量中。
$client->refreshToken($_SESSION['refresh_token']);