Почему мне нужно постоянно обновлять свой токен доступа Google Auth? - PullRequest
1 голос
/ 03 февраля 2020

В Php я использую Gmail API для чтения и удаления писем с общего c адреса электронной почты. Он работает отлично, но мне всегда нужно (несколько раз в день) заново генерировать новый токен доступа, чтобы предоставить доступ к моему сценарию к почтовому ящику, почему?

Я указал «Подтверждение утверждения» для «force», которое должен работать вечно. Последний пункт, я использую клиентскую библиотеку Google с composer (google / apiclient версии 2.0)

Вот мой код Php:

private function getClient()
{
    $client = new \Google_Client();
    $client->setApplicationName('My app');
    $client->setScopes(\Google_Service_Gmail::MAIL_GOOGLE_COM);
    $configPath = CONFIG . 'client_secret_123456790.apps.googleusercontent.com.json';
    $client->setAuthConfig($configPath);
    $client->setApprovalPrompt('force');
    $client->setIncludeGrantedScopes(true);
    $client->setLoginHint('email@example.com');
    $client->setAccessType('offline');
    $client->setPrompt('consent');

    $tokenPath = CONFIG . 'token.json';
    if (file_exists($tokenPath)) {
        $accessToken = json_decode(file_get_contents($tokenPath), true);
        $client->setAccessToken($accessToken);
    }

    // If there is no previous token or it's expired.
    if ($client->isAccessTokenExpired()) {
        // Refresh the token if possible, else fetch a new one.
        if ($client->getRefreshToken()) {
            $client->fetchAccessTokenWithRefreshToken($client->getRefreshToken());
        } else {
            return false;
        }
        // Save the token to a file.
        if (!file_exists(dirname($tokenPath))) {
            mkdir(dirname($tokenPath), 0700, true);
        }
        file_put_contents($tokenPath, json_encode($client->getAccessToken()));
    }
    return $client;
}

1 Ответ

4 голосов
/ 03 февраля 2020

Он работает отлично, но мне всегда нужно (несколько раз в день) заново генерировать новый токен доступа, чтобы предоставить доступ к моему сценарию в почтовый ящик, почему?

Токены доступа действует только в течение одного часа, это стандартно для Oauth. Вы запрашиваете автономный доступ, поэтому у вас есть токен refre sh, который можно использовать для запроса нового токена доступа с сервера аутентификации.

Я указал «Подтверждение утверждения» на «force», которое должно работать вечно.

Если вы включите в свой запрос approval Prompt on "force", это заставит пользователя снова войти в систему и дать согласие вашему приложению на область действия. Я понятия не имею, откуда у вас мысль, что это заставит его работать вечно.

Oauth2

Вы используете oauth2, токены доступа истекают через один час, при использовании автономного доступа вы получите refre sh токен, который вы можете сохранить и использовать для запроса нового токена доступа, когда истекает срок действия вашего токена доступа

Похоже, вы уже реализовали это. Если он не работает, вам кажется, что вы проверяете, что код был запущен и вы не потеряли токен refre sh каким-либо образом.

$client->fetchAccessTokenWithRefreshToken($client->getRefreshToken());

храните ссылку sh token

Я не могу найти в вашем коде, что вы сохраняете ссылку sh токен Когда вы аутентифицируете пользователя в первый раз. Вы получите refre sh токен, вы должны сохранить его где-нибудь в файле, а затем использовать его для создания нового токена доступа при следующем запуске скрипта

$client->fetchAccessTokenWithRefreshToken("TokenFromFile");

refre sh токен возвращается только в первый раз, когда пользователь аутентифицирует ваше приложение или когда вы добавляете запрос подтверждения. Не должно быть никаких причин перезаписывать этот токен, если вы не использовали его более шести месяцев.

...