Cómo acceder a Google Drive usando PHP

El escenario que voy a analizar es este: Una aplicación desarrollada en PHP requiere acceder a archivos que sus usuarios tienen almacenados en sus propios documentos en Google Drive.

Configuración de la API De Google

1. Crear un proyecto en Google (yendo a https://console.developers.google.com/apis/credentials):

  1. Habilitar el acceso a la API via OAuth (https://console.developers.google.com/apis/api/drive/overview?project=MI_PROYECTO):
  1. Crear las credenciales de acceso vía OAuth:

Seleccionar OAuth:

  1. Descargar las credenciales a un lugar seguro:
  1. Autorizar la URI de redireccionamiento

Uso de la API de Google desde PHP

Con esto hecho ya tenés lo básico para empezar a programar.

Si bien podés hacer todo en un solo archivo, no es muy recomendable, es mejor tener un archivo para cada paso del trabajo.

Ante todo, vas a necesitar la librería google/apiclient (Te recomiendo incorporarla con composer), acá podés ver un ejemplo de composer.json:

{
 "name": "leeway/google-drive",
 "require": {
 "google/apiclient": "^2.1"
 },
 "authors": [
 {
 "name": "Mauro Chojrin",
 "email": "mauro.chojrin@leewayweb.com"
 }
 ]
}

No olvides después correr el comando

composer install

Este codigo (config.php) va a ser común a todos los archivos .php que vendrán luego:

<?php
require_once 'vendor/autoload.php';
session_start();
$redirect_uri = 'http://' . $_SERVER['HTTP_HOST'] . '/paso2.php';
$client = new Google_Client();
$client->setAuthConfig('<PATH_AL_ARCHIVO_JSON_DE_CREDENCIALES>');
$client->setRedirectUri($redirect_uri);
$client->addScope("https://www.googleapis.com/auth/drive");

El primer paso:

Ofrecer al usuario un formulario para conectarse a su Drive (paso1.php):

<?php require_once 'config.php' ?>
<div class="request">
 <a class='login' href='<?php echo $client->createAuthUrl() ?>'>Conectame!</a>
</div>

Contar con una URL a la que Google informe que la autenticación fue exitosa (paso2.php):

<?php 
require_once 'config.php';

if (isset($_GET['code'])) {
 $token = $client->fetchAccessTokenWithAuthCode($_GET['code']);
 $client->setAccessToken($token);

 $_SESSION['upload_token'] = $token;

 header('Location: paso3.php');
}

Muy importante: este archivo (paso2.php) debe ser accesible para el cliente (Para eso es importante que su URL completa esté ingresada en la configuración de URI de redireccionamiento, sin eso nada de esto funcionará.

Paso 3 (Completar la autenticación):

<?php

require_once 'config.php';

if (!empty($_SESSION['upload_token'])) {
 $client->setAccessToken($_SESSION['upload_token']);
 if ($client->isAccessTokenExpired()) {
  unset($_SESSION['upload_token']);
  echo 'La sesion expiro. <a href="paso1.php">Volver a comenzar</a>';
  die;
 }
}
echo 'Autenticacion completa <a href="paso4.php">Descargar archivo</a>';

Paso 4:

Hacer lo que uno quiera en el drive autorizado :).

Ejemplo: descargar un archivo desde Google Drive usando PHP

<?php
require_once 'config.php';

echo '<p>Descargando el archivo "Mi archivo"</p>';
$service = new Google_Service_Drive($client);
$files = $service->files->listFiles([
 'q' => "name='Mi archivo'",
 'fields' => 'files(id,size)'
 ]);

if ( count($files) < 1 ) {
 echo 'No se encontro el archivo :(';
 die;
}
$fileId = $files[0]->id;
$fileSize = intval($files[0]->size);

$http = $client->authorize();

$fp = fopen('Mi archivo', 'w');

$chunkSizeBytes = 1 * 1024 * 1024;
$chunkStart = 0;

while ($chunkStart < $fileSize) {
 $chunkEnd = $chunkStart + $chunkSizeBytes;

 $response = $http->request(
  'GET',
  sprintf('/drive/v3/files/%s', $fileId),
  [
   'query' => ['alt' => 'media'],
   'headers' => [
       'Range' => sprintf('bytes=%s-%s', $chunkStart, $chunkEnd)
   ]
  ]
  );
  $chunkStart = $chunkEnd + 1;
  fwrite($fp, $response->getBody()->getContents());
 }
 fclose($fp);
echo '<p>Listo! Archivo disponible en: "'.realpath('Mi archivo').'"</p>';

Y listo, tenemos el archivo buscado descargado a nuestro disco.

Para probar esta aplicación (suponiendo que fuiste guardando cada porción de código en su propio archivo), iniciá el servidor de php:

php -S localhost:8080

y abrí en tu navegador:

http://localhost:8080/paso1.php

Claramente, no se trata de magia, lo que hay detrás de esto es un WebService, al que se está accediendo usando la clase Google_Service_Drive. Podes ver más información entrando a https://github.com/google/google-api-php-client.

Y ahora que sabés cómo manipular archivos que están en el drive… ¡cuidado con lo que hacés!

Comentarios

58 respuestas a «Cómo acceder a Google Drive usando PHP»

  1. […] Cómo acceder a Google Drive usando PHP Cómo acceder a Gmail desde PHP Cómo enviar un archivo a un WebService SOAP desde PHP Integrar dos aplicaciones con un WebService SOAP Consumir un WebService SOAP con certificado digital con PHP Cómo exponer un WebService REST con PHP […]

  2. Avatar de Sergio Obregón
    Sergio Obregón

    gracias por la explicación, solo tengo una consulta como podria buscar un archivo no por nombre exacto sino por coincidencia me traiga n cantidad de archivos y eliga cual descargar

    1. Avatar de mchojrin

      Hola Sergio:

      Ese es un caso bastante específico de uso de la API de Google Drive. Tendrías que buscar en la documentación. Este recurso te puede ayudar: https://developers.google.com/apps-script/reference/drive?hl=es-419

      Saludos,

  3. Avatar de Juan
    Juan

    Hola, muchas gracias por este aporte, me pareció muy apropiada la forma en la que segmentaste las cosas, y me dio una mejor comprensión de cada paso.
    Aprovechando su publicación, me gustaría saber si tiene algún ejemplo de cómo eliminar un archivo en google drive con el API, he visto algunos ejemplos, pero soy novato en programación, y por más que he intentado cosas no lo logro.
    Gracias de antemano

  4. Avatar de FenOY
    FenOY

    Hola, no sé como evitar que el token expire. Gracias de antemano

    1. Avatar de mchojrin

      Hola!

      ¿Podrías dar más detalles? ¿Qué es lo que estás haciendo y qué mensaje de error recibes?

      1. Avatar de FeNoY
        FeNoY

        Buenos días mchojrin,

        la idea es subir archivos desde PHP a Google Drive. Toda la conexión la hace bien, la sube a una carpeta específica y sino existe la crea, etc.

        El caso es que en el archivo token.json hay una variable «expires_in»:3599, es decir, el token caduca a la hora de haberse generado.

        Lo que quiero es que el token no expire, ya que tendría que estar siempre generando uno nuevo y en la API dice que poniendo la siguiente línea, se soluciona, pero no logro que lo haga: $client->setAccessType(‘offline’);.

        Pongo el código que estoy agregando (Está sacado de la API de Goolge Drive).

        <?php
        require DIR . ‘/vendor/autoload.php’;

        /**
        * Returns an authorized API client.
        * @return Google_Client the authorized client object
        */
        function getClient()

        {

        $client = new Google_Client();

        $client->setApplicationName('Google Drive API PHP Quickstart');
        $client->setRedirectUri('http://localhost/proyectoDrive/index.php');

        $client->setScopes(Google_Service_Drive::DRIVE);
        $client->setAuthConfig('credentials.json');
        $client->setAccessType('offline');
        $client->setPrompt('select_account consent');

        // Load previously authorized token from a file, if it exists.
        // The file token.json stores the user's access and refresh tokens, and is
        // created automatically when the authorization flow completes for the first
        // time.
        $tokenPath = 'token.json';
        if (file_exists($tokenPath)) {
        $client->setApprovalPrompt("force");
        $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 {
        // 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));
        }
        }
        // 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;

        }

        // Get the API client and construct the service object.
        $client = getClient();

        Muchas gracias de antemano

        1. Avatar de mchojrin

          Creo que no termino de ver el problema. Si el token está expirado, la renovación debería ser transparente para tí, salvo que se haya eliminado el archivo de autorización original, en cuyo caso sí te requeriría que te autentiques nuevamente.

          ¿Es eso lo que te está sucediendo?

  5. Avatar de Johan
    Johan

    Hola, estoy obteniendo un error forbidden al recibir el redireccionamiento de parte de Google, chequeando y descartando, el error ocurre porque google envía parámetro como «www.google.com» al eliminar los puntos el error se va, el tema es que así lo envía google ¿hay una forma de resolver esto por nuestra parte? Gracias de antemano

    1. Avatar de mchojrin

      Hola Johan,

      Si puedes publicar algo de código será más fácil responderte.

      A priori te diría que si quitando los puntos funciona, ¿Por qué no los eliminas del string que recibes?

  6. Avatar de sara
    sara

    Hola estoy tratando de realizar tu código para listar los archivos de drive con la autentificación auth2 eh llevado acabo todos los pasos y eh investigado pero no logro dar en por que mi siguiente error, agradecería mucho si me pudieras ayudar

    Fatal error: Uncaught Google_Service_Exception: { «error»: { «errors»: [ { «domain»: «usageLimits», «reason»: «dailyLimitExceededUnreg», «message»: «Daily Limit for Unauthenticated Use Exceeded. Continued use requires signup.», «extendedHelp»: «https://code.google.com/apis/console» } ], «code»: 403, «message»: «Daily Limit for Unauthenticated Use Exceeded. Continued use requires signup.» } } in C:\xampp\htdocs\SubirArchivosDrive\google-api-php-client\src\Google\Http\REST.php:118 Stack trace: #0 C:\xampp\htdocs\SubirArchivosDrive\google-api-php-client\src\Google\Http\REST.php(94): Google_Http_REST::decodeHttpResponse(Object(GuzzleHttp\Psr7\Response), Object(GuzzleHttp\Psr7\Request), ‘Google_Service_…’) #1 C:\xampp\htdocs\SubirArchivosDrive\google-api-php-client\src\Google\Task\Runner.php(176): Google_Http_REST::doExecute(Object(GuzzleHttp\Client), Object(GuzzleHttp\Psr7\Request), ‘Google_Service_…’) #2 C:\xampp\htdocs\SubirArchivosDrive\google-api-php-client\src\Google\Http\REST.php(58) in C:\xampp\htdocs\SubirArchivosDrive\google-api-php-client\src\Google\Http\REST.php on line 118

    1. Avatar de mchojrin

      Hola Sara:

      Gracias por tu pregunta 🙂

      Por lo que veo en tu error parece que te excediste de la cantidad de peticiones permitidas por la API.

      Deberías consultar en la documentación oficial a ver cuál es ese límite y, en todo caso, volver a intentar pasado un día.

      Otra cosa que se me ocurre que puede estar fallando es la autenticación… ¿puede ser que no estés enviando las credenciales correctas?

      Saludos!

  7. Avatar de Benjamin Otero
    Benjamin Otero

    Amigos, quiero saber si puedo hacer una pagina en PHP utilizando laravel y luego guardar información atraves de un formulario y luego rescatarla.

    1. Avatar de mchojrin

      Hola Benjamín!

      No estoy seguro de comprender bien tu pregunta. Lo que quieres lograr es perfectamente posible usando Laravel.

      Los detalles específicos dependen de una serie de otras cuestiones como ser qué tipo de base de datos utilizarás, dónde alojarás tu sitio, etc…

      Exitos!

  8. […] Hay una primera parte que hace a la autorización de la aplicación (Muy parecido a lo que hicimos para entrar al Google Drive): […]

  9. Avatar de Yan Carlos Morera Caldas
    Yan Carlos Morera Caldas

    Buen día,
    Tengo un problema con un aplicativo que vengo desarrollando hace meses, lo que pasa es que quiero subir a una carpeta en drive, un archivo de excel que tengo alojado en el servidor de la aplicación, pero para loguearse en la misma aplicación se utiliza un OAuth de Google y se genera un access_token con permisos únicamente para la información de la cuenta, y tengo entendido que los permisos (o scope, o alcance) deben ser «/drive», para poder hacer cambios en Drive, he estado viendo toturiales y blogs y no he encontrado ninguna solución,
    Gracias.

    1. Avatar de mchojrin

      ¿Por qué no puedes asignarle el scope /drive? ¿Qué error estás viendo?

  10. […] primero que se me ocurrió fue que, así como hay APIs para entrar a Gmail, a GoogleDocs y demás, debía haber alguna para usar el motor de búsqueda y obtener los datos en formato […]

  11. Avatar de Daniel
    Daniel

    Mauro, sigo avanzando poco a poco.
    Llego bien hasta el paso3.php (Autenticación completa: Descargar archivo) – en el paso4.php puse un nombre archivo que tengo en drive (‘q’ => «name=’Julieta.pdf’») y me sale el siguiente error:

    Fatal error: Uncaught Google_Service_Exception: { «error»: { «errors»: [ { «domain»: «usageLimits», «reason»: «dailyLimitExceededUnreg», «message»: «Daily Limit for Unauthenticated Use Exceeded. Continued use requires signup.», «extendedHelp»: «https://code.google.com/apis/console» } ], «code»: 403, «message»: «Daily Limit for Unauthenticated Use Exceeded. Continued use requires signup.» } } in C:\wamp64\www\vendor\google\apiclient\src\Google\Http\REST.php:118 Stack trace: #0 C:\wamp64\www\vendor\google\apiclient\src\Google\Http\REST.php(94): Google_Http_REST::decodeHttpResponse(Object(GuzzleHttp\Psr7\Response), Object(GuzzleHttp\Psr7\Request), ‘Google_Service_…’) #1 C:\wamp64\www\vendor\google\apiclient\src\Google\Task\Runner.php(181): Google_Http_REST::doExecute(Object(GuzzleHttp\Client), Object(GuzzleHttp\Psr7\Request), ‘Google_Service_…’) #2 C:\wamp64\www\vendor\google\apiclient\src\Google\Http\REST.php(58): Google_Task_Runner->run() #3 C:\wamp64\www\vendor\google\apiclient\src\Goo in C:\wamp64\www\vendor\google\apiclient\src\Google\Http\REST.php on line 118

    1. Avatar de mchojrin

      Vaya… no me había cruzado antes con ese error… Por lo que he podido leer puede deberse a dos cosas:

      1. Uso de un token vencido (Fijate la documentación sobre métodos de refresco de token)
      2. Efectivamente estás haciendo demasiados requests en poco tiempo (Para verificar esto simplemente volvé a probar tu código después de un rato de no hacer requests). Si este fuera el caso una opción que podés probar es agrupar requests de modo de no excederte de los límites establecidos.

      Algo más de info podés ver acá

  12. Avatar de Daniel
    Daniel

    Mauro, estoy tratando de ver la solución al tema.
    Mientras te comento una inquietud. Me gustaría utilizar google drive para almacenar archivos (ej: .pdf) y desde una aplicación web en php, buscar un archivo determinado por su nombre.
    Ejemplo: usuario se logea en una página y la misma muestra que tiene 3 (tres) archivos, (los datos vienen de phpmyadmin):
    1.pdf
    2.pdf
    3.pdf
    al seleccionar uno, (ej: 2.pdf), tendría que buscar ese archivo en google drive y mostrar el contenido del mismo.
    Espero me entiendas.

    1. Avatar de mchojrin

      Bien. Al lograr hacer andar el ejemplo de este post tendrías lo necesario para resolver tu necesidad, ¿correcto?

  13. Avatar de Daniel
    Daniel

    Mauro, limpie todo, reinstale y puedo ejecutarlo:
    pasa a: Conectar
    luego: accounts.google.com — muestra el inicio de sesión con el nombre del proyecto
    me logeo con la cuenta de correo y password
    y muestra lo siguiente:

    Fatal error: Uncaught GuzzleHttp\Exception\RequestException: cURL error 60: SSL certificate problem: unable to get local issuer certificate (see http://curl.haxx.se/libcurl/c/libcurl-errors.html) in C:\wamp64\www\vendor\guzzlehttp\guzzle\src\Handler\CurlFactory.php:187 Stack trace: #0 C:\wamp64\www\vendor\guzzlehttp\guzzle\src\Handler\CurlFactory.php(150): GuzzleHttp\Handler\CurlFactory::createRejection(Object(GuzzleHttp\Handler\EasyHandle), Array) #1 C:\wamp64\www\vendor\guzzlehttp\guzzle\src\Handler\CurlFactory.php(103): GuzzleHttp\Handler\CurlFactory::finishError(Object(GuzzleHttp\Handler\CurlHandler), Object(GuzzleHttp\Handler\EasyHandle), Object(GuzzleHttp\Handler\CurlFactory)) #2 C:\wamp64\www\vendor\guzzlehttp\guzzle\src\Handler\CurlHandler.php(43): GuzzleHttp\Handler\CurlFactory::finish(Object(GuzzleHttp\Handler\CurlHandler), Object(GuzzleHttp\Handler\EasyHandle), Object(GuzzleHttp\Handler\CurlFactory)) #3 C:\wamp64\www\vendor\guzzlehttp\guzzle\src\Handler\Proxy.php(28): GuzzleHttp\Handler\CurlHandler->__invoke(Ob in C:\wamp64\www\vendor\guzzlehttp\guzzle\src\Handler\CurlFactory.php on line 187

    1. Avatar de mchojrin

      Bien, vamos avanzando 🙂

      Tuve un problema similar recientemente y, en mi caso, lo resolví apagando el Firewall de Windows.

      En tu caso, no creo que eso funcione ya que composer te funciona ok (Yo no podía instalar librerías vía composer ni hacer git pull)…

      Acá tenés información de un problema similar al tuyo.

      Suerte!

  14. Avatar de Daniel
    Daniel

    Mauro, no tengo esa carpeta, ni archivo. Tengo el problema en composer.
    Al ejecutar el: composer-setup.exe – y desde un ventana de command de windows, ejecutar el
    composer install – me pide el archivo composer.json — este es el archivo que no encuentro para la
    instalación – por lo tanto si le pongo cualquier composer.json, en vendor/ aparecen cualquier carpetas
    que nada tienen que ver y por lo tanto la que vos describes no está.
    Estuve leyendo en getcomposer.org, pero no me doy cuenta de que código incluir en ese archivo composer.json.
    Si sabes como solucionar esto, te agradecería me tires un hilo.
    Muchísimas gracias

    1. Avatar de mchojrin

      Ok, ok… bueno, por lo menos ahora sabemos cuál es el problema :).

      Para empezar, veo que estás usando Windows… Me ha pasado recientemente de tener problemas para usar las herramientas de CLI en Windows (Composer por ejemplo).

      Mi recomendación es que uses todo desde la terminal de Windows. O mejor, si podés instalar y usar cygwin vas a tener una terminal POSIX (Casi como si estuvieses en Linux).

      Lo que deberías hacer es ejecutar composer install desde el directorio donde tenés el proyecto.

      Otra forma que podría servirte es, desde algún directorio que quieras (Mis Documentos, por ejemplo) y siempre desde la terminal, usar el comando composer init e ir definiendo las dependencias desde ahí.

      Una vez que tengas el directorio vendor y dentro de él google/apiclient entonces vas a poder empezar a crear los scripts propios del ejemplo.

      Saludos

  15. Avatar de Daniel
    Daniel

    require_once ‘vendor/autoload.php’;
    session_start();
    $redirect_uri = ‘http://’ . $_SERVER[‘HTTP_HOST’] . ‘/paso2.php’;
    $client = new Google_Client();
    //$client->setAuthConfig(»);
    $client->setAuthConfig(‘client_secret08.09.18.json’);
    $client->setRedirectUri($redirect_uri);
    $client->addScope(«https://www.googleapis.com/auth/drive»);

    1. Avatar de mchojrin

      Así parece estar ok… ¿podés fijarte si tenés el archivo vendor/google/apiclient/src/Google/Client.php?

      Otra cosa que veo raro es que te de el error en el paso1.php… Ese archivo debería ejecutarse únicamente al comienzo (es el que genera el link «conectame»).

      Una vez seleccionada la cuenta debería llevarte a paso2.php (Lo que está en la varaible $redirect_uri).

      Si nada de esto te funciona diría que trates de debugearlo usando XDebug o similar.

      Ya sin ver el código en su contexto me temo que no voy a poder ayudarte… si querés que lo veamos juntos podemos coordinar una sesión de consulta.

      Saludos

  16. Avatar de Daniel
    Daniel

    Disculpa Mauro, creo haber copiado bien el config.php – pero en el post muestra menos código, nuevamente te lo paso al config.php

    setAuthConfig(»);
    $client->setAuthConfig(‘client_secret08.09.18.json’);
    $client->setRedirectUri($redirect_uri);
    $client->addScope(«https://www.googleapis.com/auth/drive»);
    ?>

    1. Avatar de mchojrin

      Sigo viendo lo mismo 🙁

      pegá el código sin los tags de inicio y fin de php

  17. Avatar de Daniel
    Daniel

    Así está el config.php

    setAuthConfig(‘client_secret08.09.18.json’);
    $client->setRedirectUri($redirect_uri);
    $client->addScope(«https://www.googleapis.com/auth/drive»);
    ?>

    y el autoload.php

    <?php

    // autoload.php @generated by Composer

    require_once __DIR__ . '/composer/autoload_real.php';

    return ComposerAutoloaderInitcefa83e962c7304c4fad88596dfee348::getLoader();

    1. Avatar de mchojrin

      Bien.

      El autoload que muestras es el generado por composer. Eso está ok.

      Lo que parece faltar (a juzgar por el código que muestras) es el require_once 'vendor/autoload.php' en el archivo config.php.

  18. Avatar de Daniel
    Daniel

    Hola Mauro, esto es lo que muestra composer.json luego de actualizar y reinstalar composer:

    {
    «require»: {
    «guzzlehttp/guzzle»: «^6.0»
    }
    }

    1. Avatar de mchojrin

      Ok… eso parece correcto… ¿Será que te falta el require_once ‘vendor/autoload.php’;?

    2. Avatar de luis
      luis

      hola ! sera posible puedas hacer un copy paste de todo para solo cambiar la direccion y usar la propia para que funcione todo bien gracias

      1. Avatar de mchojrin

        Perdona, creo que no entendí… ¿cuál es tu duda?

  19. Avatar de Daniel
    Daniel

    Hola, ejecuto paso1, me sale Conectame! – al hacer click me lleva a elegir una cuenta de gmail.
    Luego de elegida muestra el siguiente error:

    Fatal error: Cannot use lexical variable $eventName as a parameter name in C:\wamp64\www\vendor\guzzlehttp\guzzle\src\Event\Emitter.php on line 48

    Espero me puedas guiar.
    Muchas gracias

    1. Avatar de mchojrin

      Parece que podrías tener desactualizada tu versión de guzzle. Fijate en https://github.com/google/google-api-php-client/issues/1068

      1. Avatar de Daniel
        Daniel

        Estimado Mauro, muchas gracias por tu tiempo. Actualice guzzle con: composer update – lo reinstalé nuevamente, ahora me sale que no encuentra una clase:

        Fatal error: Uncaught Error: Class ‘Google_Client’ not found in C:\wamp64\www\config.php:5 Stack trace: #0 C:\wamp64\www\paso1.php(2): require_once() #1 {main} thrown in C:\wamp64\www\config.php on line 5

        del config.php

        1. Avatar de mchojrin

          Hola Daniel:

          ¿Cómo estás? Parece que te faltaría instalar algo… ¿Tu archivo composer.json se ve como el que está en el post?

  20. Avatar de Claudio
    Claudio

    Hola, estoy necesitando un script al que puedan acceder varios usuarios de google para buscar documentos dentro de una carpeta compartida. Es posible esto utilizando esta api?
    Puedo llegar a suponer (o exigir) que todos estos usuarios ya se encuentren logeados con su correspondiente cuenta.
    Me podrian guiar a un ejemplo?

    1. Avatar de mchojrin

      Hola Claudio:

      ¿Cómo estás? No tengo un caso específico de lo que buscas, pero me imagino que se podría usar la API para resolver tu problema. ¿Hiciste alguna prueba con la que hayas tenido dificultades?

      Acá veo una pregunta similar a la tuya.

      ¿Eso resuelve tu problema?

  21. Avatar de mchojrin

    Hola Germán:

    Gracias por tu comentario. En respuesta a tu pregunta sí, las credenciales de acceso a tu Google Drive las debes crear por fuera de la aplicación.

    Tu próximo destino seguramente será https://console.developers.google.com/apis/credentials 🙂

    Exitos!!

  22. Avatar de german
    german

    hola mcchojrin los archivos paso1 y los demas lo debo de crear yo mismo??

  23. Avatar de mchojrin

    Hola Eder:

    ¡No es ninguna molestia! Haz todas las preguntas que necesites y trataré de ayudarte :). No llego a entender cuál es exactamente el problema que tienes… ¿qué tiene de malo esa URL?

  24. Avatar de eder
    eder

    bien en URIs de redirección autorizados tengo http://localhost/paso2.php

    y en pantalla de autorizacion de OAuth estan los siguientes campos como deben de ir y disculpa las molestias.
    en URL de pagina principal:
    URL de logotipo de producto:
    URL de la politica de privacidad
    URL de las condiciones de servicio:

  25. Avatar de eder
    eder

    Gracias, ya la coloque y me pasa a la pantalla que dice:

    Te damos la bienvenida
    ederantonyo@gmail.com

    Ver y administrar los archivos en Google Drive
    ¿Quieres permitir a prueba hacer esto?

    Al hacer clic en Permitir, esta aplicación podrá usar tu información de conformidad con sus condiciones de servicio y políticas de privacidad. Puedes retirar esta aplicación (o cualquiera que esté conectada a tu cuenta) en Mi Cuenta

    ->Permitir y al darle en permitir ya no me manda a ningun lado :/ ¡Objeto no localizado! Error 404 localhost

    1. Avatar de mchojrin

      Seguramente te quedó mal configurada la URI de redireccionamiento.

      Es fácil de ver. Empezá por hacerlo vos mismo desde tu navegador, intentá ingresar directamente al archivo paso2.php

      Una vez que lo logres, esa es la URI que tiene que estar en la configuración de Google.

  26. Avatar de mchojrin

    En realidad no es correcto decir que Google debe poder acceder, ya que el callback lo realiza el mismo visitante (Su navegador en rigor de verdad)… Podés ver todo esto si vas siguiendo las URLs que se generan en los links y a través de tu navegador.

    Es por eso que, para un entorno productivo, deberías poner una dirección accesible públicamente (Por ejemplo http://academy.leewayweb.com/google_callback.php)

    En el caso de una prueba como esta, la dirección que debe figurar en el cuadro de URI de redireccionamiento debe ser «http://localhost/paso2.php» (O la que uses para acceder a tu sitio en localhost).

    En mi caso sería http://localhost:8080/paso2.php

  27. Avatar de eder
    eder

    muchas gracias , tengo una duda en esta parte :

    Muy importante: este archivo (paso2.php) debe ser accesible desde Google (Para eso es importante que su URL completa esté ingresada en la configuración de URI de redireccionamiento, sin eso nada de esto funcionará.
    que dire

  28. Avatar de eder
    eder

    Ahora me marca este error:

    Notice: Undefined variable: oauth_credentials in C:\xampp\htdocs\composer\config.php on line 5
    C:\xampp\htdocs\composer\vendor\google\auth\src\OAuth2.php on line 644

    1. Avatar de mchojrin

      Bueno… parece que vamos avanzando 🙂

      La variable $oauth_credentials debe contener la ruta al archivo json que descargaste al crear las credenciales.

      Lo voy a especificar en el post. Gracias!

  29. Avatar de mchojrin

    Prueba con el comando

    composer install

  30. Avatar de eder
    eder

    revisando si lo instale en xampp, creo que lo que me falta es hacer el archivo vendor/autoload.php pero no se como hacerlo o como generarlo.

  31. Avatar de eder
    eder

    asi es C:\xampp\htdocs no lo he instalado ahi solo lo instale.

  32. Avatar de mchojrin

    Hola Eder:

    Por lo que veo entiendo que tienes una aplicación web en C:\xampp\htdocs, ¿correcto?.

    ¿Has instalado composer ahí?

    Por si no conoces mucho del tema te recomiendo leer http://academy.leewayweb.com/que-es-composer/

  33. Avatar de eder
    eder

    Hola que tal buen día, me marca el siguiente error que me estara faltando:

    Warning: require_once(C:\xampp\htdocs\composer\vendor/composer/autoload_real.php): failed to open stream: No such file or directory in C:\xampp\htdocs\composer\vendor\autoload.php on line 5

    Fatal error: require_once(): Failed opening required ‘C:\xampp\htdocs\composer\vendor/composer/autoload_real.php’ (include_path=’C:\xampp\php\PEAR’) in C:\xampp\htdocs\composer\vendor\autoload.php on line 5

¿Te quedó alguna duda? Publica aca tu pregunta

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.