API событий Google возвращает ошибку 401 unauthorized_client - PullRequest
0 голосов
/ 20 марта 2019

Я создал приложение в laravel для синхронизации моего календаря пользователей в моей базе данных с инкрементной синхронизацией , когда все работает отлично, когда я запускаю его в своем браузере.

но он возвращает 401 unauthorized_client в моем cron 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 голосов
/ 20 марта 2019

401 unauthorized_client

Означает, что ваш код не был авторизован. Если вы хотите получить доступ к личным данным пользователя, вам необходимо войти в систему. Для доступа к API Google вашему коду необходим токен доступа.

Что вам следует сделать, это авторизовать свой код один раз с помощью Oauth2 в браузере, сохранить токен обновления где-нибудь и попросить, чтобы задание cron прочитало токен обновления и запросило новый токен доступа до его запуска.

Предполагая, что у вас есть учетная запись, которую вы пытаетесь вставить в нее, вы также можете рассмотреть возможность использования служебной учетной записи.

Обновить токен

Если вы храните токен обновления в базе данных, вы должны назначить его своему клиенту, прежде чем запускать здесь свой код. Я делаю это с токеном обновления, хранящимся в переменной сеанса.

$client->refreshToken($_SESSION['refresh_token']);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...