Google Events API返回401错误未经授权的客户端

时间:2019-03-20 10:57:33

标签: php laravel google-calendar-api

我已经在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中无法工作的代码完全相同。

1 个答案:

答案 0 :(得分:0)

  

401未经授权的客户端

表示您的代码尚未获得授权。如果要访问私人用户数据,则需要登录。您的代码需要访问令牌才能访问Google api。

您应该做的是在浏览器中使用Oauth2对代码进行一次授权,将刷新令牌保存在某个位置,并让cron作业读取刷新令牌并在运行之前请求新的访问令牌。

假设您拥有尝试插入的帐户,那么您可能还需要考虑使用服务帐户。

刷新令牌

如果要将刷新令牌存储在数据库中,则必须先将其分配给客户端,然后再在此处运行代码,我这样做是将刷新令牌存储在会话变量中。

$client->refreshToken($_SESSION['refresh_token']);