Utilisation d’une google cloud function avec authorisation en php

Cet article est assez ancien, malgré toute l'attention que j' apporte à mes contenus il est possible que celui-ci ne soit plus d'actualité.
N'hésitez pas à me le signaler si nécessaire via le formulaire de contact.

Petit tutoriel qui sors un peu de mes sujets habituels mais qui reste dans le cadre du développement php.
Nous allons voir comment appeler une google cloud fonction, qui nécessite une authentification.

La difficulté pour moi a vraiment été l’authentification et c’est un sujet qui m’a fait perdre un temps fou car la documentation de Google n’était absolument pas
claire sur le sujet.
L’authentification est réalisée via un fichier json reprenant les informations d’un compte de service. ( Cf. exemple ci-dessous )

Comme vous pouvez le juger sur la page suivante :  https://cloud.google.com/functions/docs/securing/authenticating 

Des exemples sont donnés en NodeJs, Go , Python et Java, mais en Php nous sommes invités à utiliser des bibliothèques tiers pour générer des jetons d’authentification, sans explications détaillées.

Voici un exemple de contenu du fichier d’authentification json

{
  "type": "service_account",
  "project_id": "PROJECT-ID",
  "private_key_id": "PRIVATE-KEY-ID",
  "private_key": "PRIVATE-KEY",
  "client_email": "[email protected]",
  "client_id": "CLIENT-ID",
  "auth_uri": "https://accounts.google.com/o/oauth2/auth",
  "token_uri": "https://oauth2.googleapis.com/token",
  "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
  "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/CUSTOMER-URL"
}

Après pas mal de recherches j’ai finalement trouvé que contrairement à ce que décrit la documentation, Google fournit la libraire Google_Auth qui fait le nécessaire …

Et c’est relativement simple à mettre en place. ( cf. la page github de l’extension : https://github.com/googleapis/google-auth-library-php )

Voici un donc un exemple concret d’appel à une google cloud fonction avec l’authentification.
Il est nécessaire d’utiliser composer et de charger la libraire google/auth

Voici ensuite le code à appeler ( c’est presque le même que l’exemple par défaut )

 
require_once __DIR__.'vendor/autoload.php';
 
use Google\Auth\ApplicationDefaultCredentials;
use GuzzleHttp\Client;
use GuzzleHttp\HandlerStack;
 
// CHEMIN Vers le fichier JSON défini plus haut sur votre poste
putenv('GOOGLE_APPLICATION_CREDENTIALS=/path/to/my/credentials.json');
 
//Définition des urls à utiliser
$apiBaseUrl = 'https://identifiant.cloudfunctions.net'; 
$functionPath = '/Nom_de_la_fonction';
$targetAudience = $apiBaseUrl.$functionPath;
 
//Création du client Guzzle avec le middleware qui va gérer l'authentification
$middleware = ApplicationDefaultCredentials::getIdTokenMiddleware($targetAudience);
$stack = HandlerStack::create();
$stack->push($middleware);
$client = new Client([
    'handler' => $stack,
    'auth' => 'google_auth',
    'base_uri' => $apiBaseUrl,
]);
 
// Ensuite on peut envoyer la requête, par ex du JSON
$response = $client->post(
    $functionPath,
    [
        \GuzzleHttp\RequestOptions::JSON => ['test' => 'data'], //Encodage en json du tableau donné
        'debug' => true, //Flag débug si nécessaire
    ]
);
 
//Et voir le résulat de l'appel
print_r((string) $response->getBody());

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *