Question

J'essaie d'utiliser l'API Google Drive via le Identité de l'application interface fournie avec Google App Engine.Cela permet essentiellement à mon application Web de communiquer avec les API de Google de serveur à serveur.

Je n'ai pas besoin que mes utilisateurs se connectent, je dois simplement afficher mes propres documents Google Drive.

Cependant, après avoir défini toutes les valeurs et étendues appropriées et activé tous les bons boutons Google Drive sur la page de la console, j'obtiens toujours ceci pour une simple requête GET à https://www.googleapis.com/drive/v2/files:

{ "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." }}

Qu'est-ce qui ne va pas?Qu'est-ce que je rate?Voici le code qui effectue réellement la requête. Ce qui est drôle, c'est que cela fonctionne très bien si j'utilise d'autres API telles que l'API de raccourcissement d'URL :

var scopes = new java.util.ArrayList();                                                                                                    
scopes.add("https://www.googleapis.com/auth/drive");                                                                                       
var appIdentity = AppIdentityServiceFactory.getAppIdentityService();                                                                       
var accessToken = appIdentity.getAccessToken(scopes);

var url = new URL("https://www.googleapis.com/drive/v2/files");                                                                            
var connection = url.openConnection();                                                                                                     
connection.setDoOutput(true);                                                                                                              
connection.setRequestMethod("GET");                                                                                                        
connection.addRequestProperty("Content-Type", "application/json");                                                                         
connection.addRequestProperty("Authorization", "OAuth " + accessToken.getAccessToken());

MODIFIER

Si je change simplement l'API pour utiliser le urlshortner API par exemple, ça marche :

var url = new URL("https://www.googleapis.com/urlshortener/v1/url/history");

Et sortie :

{ "kind": "urlshortener#urlHistory", "totalItems": 0, "itemsPerPage": 30}

Il doit donc y avoir quelque chose qui ne fonctionne pas avec Google Drive et App Identity ?

MODIFIER 2

J'ai trouvé de l'aide grâce à la bonne réponse ici : https://stackoverflow.com/a/12526286/50394

Mais il s'agit de définir les étendues de l'API client sur Google Apps, et je n'utilise pas Google Apps, j'utilise simplement le domaine de Google App Engine. foo.appspot.com

Était-ce utile?

La solution

L'erreur 403 que vous obtenez signifie qu'il n'y avait pas d'en-tête Authorization dans votre GET.La logique est que sans en-tête Authorization, vous êtes anonyme (vous êtes une légion bla bla :-)).Le quota Drive pour une utilisation anonyme est nul, d'où le message.Le raccourcisseur d'URL a un quota d'anonymat plus élevé, donc cela fonctionne.

Je vous suggère de modifier l'URL pour qu'elle pointe vers votre propre serveur http et de vérifier quels en-têtes vous envoyez réellement.

Autres conseils

AFAICT vous devriez utiliser Bearer dans l’en-tête Autorisation.

Ce qui se passe probablement, c'est que l'API Drive ne reconnaît pas le compte de service (à cause d'un mauvais en-tête ?) et le prend donc comme une demande anonyme puisque non key Le paramètre n'était pas fourni non plus (voir paramètres de requête courants).

Essaye ça:

connection.addRequestProperty("Authorization", "Bearer " + accessToken.getAccessToken());

Ou vous pouvez essayer d'ajouter le jeton comme access_token paramètre de requête.

Je pense que vous devriez au moins configurer une entrée de console API avec l'API Drive activée sur https://code.google.com/apis/consoleUne fois que vous aurez créé ceci, vous obtiendrez un identifiant que vous pourrez utiliser dans votre objet GoogleCredential.À partir de l'objet GoogleCredential, vous pouvez obtenir le jeton d'accès que vous pouvez ensuite ajouter à votre demande.

Ce que j'ai lu ici (Google Drive via les comptes de service) était que vous utilisiez un style légèrement différent qui utilise une CLÉ API que vous récupérez à partir de la console du développeur.
Les parties pertinentes pour moi étaient de générer une "Clé pour les applications serveur", puis d'utiliser cette technique, que je n'avais pas lue n'importe où ailleurs!

      HttpTransport httpTransport = new NetHttpTransport();
  JsonFactory jsonFactory = new JacksonFactory();
  AppIdentityCredential credential =
      new AppIdentityCredential.Builder(DriveScopes.DRIVE).build();
  // API_KEY is from the Google Console as a server API key
  GoogleClientRequestInitializer keyInitializer =
      new CommonGoogleClientRequestInitializer(API_KEY);
  Drive service = new Drive.Builder(httpTransport, jsonFactory, null)
      .setHttpRequestInitializer(credential)
      .setGoogleClientRequestInitializer(keyInitializer)
      .build();

Ce répondre affirme que :

Les comptes de service ne sont pas pris en charge par le SDK Drive en raison de son modèle de sécurité.

Si cela est toujours vrai, une solution de contournement consiste à effectuer une fois une danse OAuth régulière avec un compte Google standard et à conserver le jeton d'accès et d'actualisation dans la banque de données.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top