Cómo acceder a Google Drive usando PHP

Home / 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": "mauro/google-drive",
 "require": {
 "google/apiclient": "^2.1"
 },
 "authors": [
 {
 "name": "Mauro Chojrin",
 "email": "mchojrin@gmail.com"
 }
 ]
}

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

<?php
require_once 'vendor/autoload.php';
$redirect_uri = 'http://' . $_SERVER['HTTP_HOST'] . 'oauth_callback.php';
$client = new Google_Client();
$client->setAuthConfig($oauth_credentials);
$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');
}

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']);
  header('Location: paso1.php');
 }
}

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';

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

$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);

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

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

CEO at Leeway
Mauro es Lic. en Ciencias de la Computación.
Su carrera como docente de programación se inició en el año 1997 en la Escuela Técnica ORT.
Actualmente coordina el desarrollo de proyectos web en Leeway y los cursos dictados en la Leeway Academy

Deja un comentario

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