web-dev-qa-db-fra.com

Erreur de portée d'authentification insuffisante à l'aide de l'API Google

J'ai configuré le SDK Google pour utiliser l'API Google avec Informations d'identification par défaut de l'application . Pour ma machine locale, j'ai créé un fichier json d'informations d'identification et défini son chemin d'accès comme GOOGLE_APPLICATION_CREDENTIALS comme variable d'environnement. Cela fonctionne comme prévu sans problème.

Cependant, lorsque l'application est déployée sur Google Cloud VM, elle génère l'erreur suivante:

[Google_Service_Exception]                                             
{                                                                      
    "error": {                                                           
      "code": 403,                                                       
      "message": "Request had insufficient authentication scopes.",      
      "errors": [                                                        
        {                                                                
          "message": "Request had insufficient authentication scopes.",  
          "domain": "global",                                            
          "reason": "forbidden"                                          
        }                                                                
      ],                                                                 
      "status": "PERMISSION_DENIED"                                      
    }                                                                    
}

Selon documentation , le compte de service intégré doit être associé à l'instance de machine virtuelle. Pour le faire fonctionner, j'ai essayé d'utiliser le fichier json d'informations d'identification comme je l'ai fait sur la machine locale (qui fonctionnait bien) mais cela n'a pas fonctionné non plus.

Pour noter, le message d'erreur concerne les étendues mais pas le problème d'authentification. Que faire pour le faire fonctionner sur Compute Engine VM instance?

Pour donner le code d'initialisation du client:

$client = new Google_Client();
$client->useApplicationDefaultCredentials();
$client->addScope(Google_Service_Pubsub::PUBSUB);
10
seferov

Mise à jour

Maintenant, il est pris en charge. Vous devez arrêter l'instance afin de changer la portée de l'API. https://cloud.google.com/compute/docs/access/create-enable-service-accounts-for-instances#changeserviceaccountandscopes

Réponse originale

Il s'est avéré que je devais activer la portée d'accès à l'API Cloud pour les services sur Google Cloud Console pour VM: https://console.cloud.google.com/compute/instances

Malheureusement, je n'ai pas pu le modifier, car Google Cloud ne le prend pas en charge pour l'instant. J'ai dû démarrer une nouvelle instance pour activer un accès à l'API de service. https://googlecloudplatform.uservoice.com/forums/302595-compute-engine/suggestions/13101552-ability-to-change-cloud-api-access-scopes-on-launc

10
seferov

C'est possible maintenant. Votre instance doit être arrêtée, puis sa liste d'étendues peut être modifiée à partir de la console dans la page edit vm ou dans le SDK en utilisant:

gcloud compute instances stop [vmname] gcloud beta compute instances set-scopes [vmname] --scopes="[scopes list]"

Sachez simplement qu'avec la méthode SDK, la deuxième commande sera réinitialisée avec les étendues de la liste. Il n'est pas actuellement disponible la possibilité d'ajouter uniquement une nouvelle portée.

2
MarcoSantana