googleworkspace / php-samples

PHP samples for Google Workspace APIs
Apache License 2.0
288 stars 347 forks source link

Command-line / Offline app token token keeps expiring even though there's refresh token #58

Open lordspace opened 4 years ago

lordspace commented 4 years ago

I think i found a bug in : https://github.com/gsuitedevs/php-samples/blob/master/drive/quickstart/quickstart.php

Sample: https://youtu.be/NMGaXlq0qAk

Expected Behavior

the token to auto renew

Actual Behavior

the token doesn't renew and I am prompted for auth url again

Steps to Reproduce the Problem

run the example https://github.com/gsuitedevs/php-samples/blob/master/drive/quickstart/quickstart.php

Specifications

Windows 10 Home/ 64

C:\Users\User>php -v PHP 7.2.22 (cli) (built: Aug 28 2019 09:29:01) ( ZTS MSVC15 (Visual C++ 2017) x64 ) Copyright (c) 1997-2018 The PHP Group Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies with Xdebug v2.7.2, Copyright (c) 2002-2019, by Derick Rethans

Code example (fix)

            $renewed = 0;

            // Refresh the token if possible, else fetch a new one.
            if ( $client->getRefreshToken() ) {
                $client->fetchAccessTokenWithRefreshToken( $client->getRefreshToken() );
                $renewed = 1;
            } else {
                // Request authorization from the user.
                $authUrl = $client->createAuthUrl();
                printf( "Open the following link in your browser:\n%s\n", $authUrl );
                print 'Enter verification code: ';
                $authCode = trim( fgets( STDIN ) );

                // Exchange authorization code for an access token.
                $accessToken = $client->fetchAccessTokenWithAuthCode( $authCode );
                $client->setAccessToken( $accessToken );

                // Check to see if there was an error.
                if ( array_key_exists( 'error', $accessToken ) ) {
                    throw new Exception( join( ', ', $accessToken ) );
                }
            }

            if (! $renewed) {
                // Save the token to a file.
                if ( ! file_exists( dirname( $tokenPath ) ) ) {
                    $mkdir_res = mkdir( dirname( $tokenPath ), 0700, true );

                    if ( empty( $mkdir_res ) ) {
                        throw new Exception( "Cannot create parent directory for file: " . $tokenPath );
                    }
                }

                $save_res = file_put_contents( $tokenPath, json_encode( $client->getAccessToken() ), LOCK_EX );

                if ( empty( $save_res ) ) {
                    throw new Exception( "Cannot save file: " . $tokenPath );
                }
            }