1
votes

I followed THIS TUTORIAL to upload a file on Google Drive with php, directly from a REMOTE SERVER: so I create new API Project from Google API Console, enable Drive API and Drive SDK services, request OAuth Client ID and Client Secret, and write them in a script, then upload it together with Google APIs Client Library for PHP folder to http://www.MYSERVER.com/script1.php, to retrieve Auth code:

<?php

require_once 'google-api-php-client/src/Google_Client.php';
require_once 'google-api-php-client/src/contrib/Google_DriveService.php';

$drive = new Google_Client();

$drive->setClientId('XXX'); // HERE I WRITE MY Client ID

$drive->setClientSecret('XXX'); // HERE I WRITE MY Client Secret

$drive->setRedirectUri('urn:ietf:wg:oauth:2.0:oob');

$drive->setScopes(array('https://www.googleapis.com/auth/drive'));

$gdrive = new Google_DriveService($drive);

$url = $drive->createAuthUrl();
$authorizationCode = trim(fgets(STDIN));

$token = $drive->authenticate($authorizationCode);

?>

When I visit http://www.MYSERVER.com/script1.php it run perfectly, so I allow authorization and get the Auth code that I can write in a second script. Then I upload it to http://www.MYSERVER.com/script2.php, who looks like:

<?php

require_once 'google-api-php-client/src/Google_Client.php';
require_once 'google-api-php-client/src/contrib/Google_DriveService.php';

$drive = new Google_Client();

$drive->setClientId('X');  // HERE I WRITE MY Client ID
$drive->setClientSecret('X');  // HERE I WRITE MY Client Secret
$drive->setRedirectUri('urn:ietf:wg:oauth:2.0:oob');
$drive->setScopes(array('https://www.googleapis.com/auth/drive'));

$gdrive = new Google_DriveService($drive);

$_GET['code']= 'X/XXX'; // HERE I WRITE AUTH CODE RETRIEVED AFTER RUNNING REMOTE script.php

file_put_contents('token.json', $drive->authenticate());

$drive->setAccessToken(file_get_contents('token.json'));

$doc = new Google_DriveFile();

$doc->setTitle('Test Drive');
$doc->setDescription('Document');
$doc->setMimeType('text/plain');

$content = file_get_contents('drive.txt');

$output = $gdrive->files->insert($doc, array(
      'data' => $content,
      'mimeType' => 'text/plain',
    ));

print_r($output);

?>

Well, now I can upload in the same folder of MYSERVER a token.json empty file (writable) and a simple drive.txt (file to upload in my Drive), but when I finally visit http://www.MYSERVER.com/script2.php browser gives everytime a HTTP 500 (Internal Server Error) and obv no file is uploaded in my Google Drive: there are errors in the steps, or some issue with the scripts? Please help me to resolve this!

EDIT:

MYSERVER error log is full of:

PHP Fatal error:  Uncaught exception 'Google_AuthException' with message 'Error fetching OAuth2 access token, message: 'invalid_grant'' in /var/www/vhosts/.../gdrive/google-api-php-client/src/auth/Google_OAuth2.php:113
Stack trace:
#0 /var/www/vhosts/.../gdrive/google-api-php-client/src/Google_Client.php(131): Google_OAuth2->authenticate(Array, NULL)
#1 /var/www/vhosts/.../gdrive/sample2.php(23): Google_Client->authenticate()
#2 {main}
thrown in /var/www/vhosts/.../gdrive/google-api-php-client/src/auth/Google_OAuth2.php on line 113
1
Check your server logs for what the actual error is. - ceejayoz
your code seems good for now, check your error log for errors, also double check file permissions, it would trigger an error if the script does not have a permission to write files ( which seems for now the only possible problem) - SAFAD
that are access logs. check the error logs. - Green Black
@John : Those* :p and thank you for the good laugh ! +1 - SAFAD
Huxley, my man, those inputs are from the ACCESS log, it is fairly useless for us now, we need ERROR logs which can be found in error_log - SAFAD

1 Answers

2
votes

it seems that you cannot get new access token because your old one has not expired yet, that is what's this code is telling you :

'Google_AuthException' with message 'Error fetching OAuth2 access token, message: 'invalid_grant'

You must get the access token ONCE, save it somewhere and use it until it expires, you can not get new access token each time you try to query something

to revoke your first access token go to Google API Console and you will find it under Client ID for installed applications

Best Regards