Cómo acceder a Google Drive usando PHP

Inicio / Cómo hacer para... / 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 almacenados en Google Drive.

Los pasos son los siguientes:

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

2. Habilitar el acceso a la API via OAuth (https://console.developers.google.com/apis/api/drive/overview?project=MI_PROYECTO):

3. Crear las credenciales de acceso vía OAuth:

Seleccionar OAuth:

4. Descargar las credenciales a un lugar seguro:

5. Autorizar la URI de redireccionamiento

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

Se puede hacer todo en un solo archivo (aunque no es muy recomendable) o se puede tener un archivo para cada paso del trabajo.

Te muestro un ejemplo de lo segundo.

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 :).

Voy a poner un ejemplo de descargar un archivo:

<?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!

mchojrin

Hola! Soy Mauro Chojrin, estudié la Lic. en Ciencias de la Computación en la UBA.

Me desempeño como docente de programación desde el año 1997.

Pasé por diferentes instituciones (Escuela Técnica ORT, Digital House, EducacionIT, ITMaster, Escuela DaVinci entre otros).

Actualmente coordino el desarrollo de proyectos web en https://leewayweb.com y los cursos dictados en Leeway Academy

16 comentarios

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

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