orbitroom
@orbitroom
Fullstack, laravel, php, js, css. Стаж 10 лет

Как организовать хранение токенов для нескольких пользователей в Google client?

Доброго времени суток.

Пишу свой интерфейс для работы с google drive, но меня сильно тормозит работа с клиентом.

Постоянная проблема с токеном — invalid_grant или множество других, связанных с токеном.

$client = new \Google_Client();

        $client->setClientId('myid.apps.googleusercontent.com');
        $client->setClientSecret('dsafasddadasdadad');
        $client->setRedirectUri($redirect_uri);
        $client->addScope(\Google_Service_Drive::DRIVE);
        $client->setAccessType("offline");

        // Запрос на подтверждение работы с Google-диском
        if (isset($_REQUEST['code'])) {
            $token = $client->authenticate($_REQUEST['code']);
            $_SESSION['accessToken'] = $token;
            header('Location:' . filter_var($redirect_uri, FILTER_SANITIZE_URL));
        } elseif (!isset($_SESSION['accessToken'])) {
            header('Location:' . filter_var($client->createAuthUrl(), FILTER_SANITIZE_URL));
        }

        try {
            // Присваиваем защитный токен для работы с Google-диском
            $client->setAccessToken($_SESSION['accessToken']);
        } catch (\Exception $e) {
            die($e->getMessage() . " — " . var_dump($_SESSION));
        }


При данной конструкции периодически выбрасывает ошибку с токенами, что они устарели или некорректны (к сожалению листинг ошибки не сохранил, нужно ждать чтобы просрочились токены).

При использовании конструкции $client->isAccessTokenExpired() и $client->getRefreshToken() (брал из доков по стандарту), периодически возникает ошибка invalid_grant, Bad Request

Кто писал подобные конструкции для множественного числа пользователей? Уже неделю пытаю эту проблему перерыл все англоязычные ресурсы, не нашел вменяемого примера с $client->isAccessTokenExpired() и $client->getRefreshToken() для приложения
  • Вопрос задан
  • 102 просмотра
Пригласить эксперта
Ответы на вопрос 1
SerJook
@SerJook
кодер
Я не увидел, где у вас тут множество пользователей. Вы имеете в виду множество пользователей вашего сайта?
Вы храните данные в сессии, у каждого своя сессия, поэтому по идее они не должны пересекаться.

Во-первых, вы не проверяете то, что вернул вам вызов $client->authenticate($_REQUEST['code']);
а сразу пишете результат в сессию.
Сделайте проверку вроде
if (isset($token['access_token'])) { }

Потом, надо обновлять access token, если истек срок действия. Что-то вроде:

$client->setAccessToken($_SESSION['accessToken']);

if ($client->isAccessTokenExpired()) {
        $new_token = $client->refreshToken(null);
        if (isset($new_token['access_token'])) {
            $_SESSION['accessToken'] = $new_token;
        }
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы