@bruhanda
php, golang, java

Goole api Oauth 2.0 авторизация ,server-side, проблема с refresh token, почему токен не работает после обновления?

public function getClient()
    {
        $client = new Google_Client();
        $client->setApplicationName($this->application_name);
        $client->setClientId($this->client_id);
        $client->setClientSecret($this->client_secred);
        $client->setScopes($this->scopes);
        $client->setAuthConfig($this->client_secret_path);
        $client->setRedirectUri($this->redirect_uri);
        $client->setAccessType("offline");
        $client->setApprovalPrompt('force');
        $client->setIncludeGrantedScopes(true);


        if (file_exists($this->client_credential_path))
        {
            $access_token = json_decode(file_get_contents($this->client_credential_path), true);
        } else
        {

            if (isset($_GET['code']))
            {

                $authCode = $_GET['code'];

                // Exchange authorization code for an access token.
                $access_token = $client->authenticate($authCode);
                $access_token['refresh_token'] = $client->getRefreshToken();


                // Store the credentials to disk.
                if (array_key_exists('access_token', $access_token))
                {
                    if (!file_exists(dirname($this->client_credential_path)))
                    {
                        mkdir(dirname($this->client_credential_path), 0700, true);
                    }

                    file_put_contents($this->client_credential_path, json_encode($access_token));
                }
            } else
            {

                // Request authorization from the user.
                $authUrl = $client->createAuthUrl();

                header('Location: ' . filter_var($authUrl, FILTER_SANITIZE_URL));
                exit;
            }
        }

        $client->setAccessToken($access_token);
        
        if ($client->isAccessTokenExpired())
        {

            $refresh_token = isset($access_token['refresh_token']) ? $access_token['refresh_token'] : NULL;
            $client->refreshToken($refresh_token);
            $new_access_token = $client->getAccessToken();
            $new_access_token['refresh_token'] = $refresh_token;          
            file_put_contents($this->client_credential_path, json_encode($new_access_token));

            $client->setAccessToken($new_access_token);
            
        }
        
        return $client;
    }


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

По истечении времени жизни токена отрабатывает кусок кода ниже
if ($client->isAccessTokenExpired())
        {

            $refresh_token = isset($access_token['refresh_token']) ? $access_token['refresh_token'] : NULL;
            $client->refreshToken($refresh_token);
            $new_access_token = $client->getAccessToken();
            $new_access_token['refresh_token'] = $refresh_token;          
            file_put_contents($this->client_credential_path, json_encode($new_access_token));

            $client->setAccessToken($new_access_token);
            
        }

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

Google_Service_Exception [ 401 ]: { "error": { "code": 401, "message": "Request had invalid authentication credentials.", "errors": [ { "message": "Request had invalid authentication credentials.", "domain": "global", "reason": "unauthorized" } ], "status": "UNAUTHENTICATED" } }


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

В какую сторону копать, то что рефрешить токен можно не более 25 раз в сутки я знаю, лимиты запросов тоже не переступал.

PS: опытным путем было установлено что новый токен который мы получили после рефреша начинает тоже работать после того как мы меняем Scopes на другие :-) что за странное поведение?
  • Вопрос задан
  • 660 просмотров
Пригласить эксперта
Ваш ответ на вопрос

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

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