Domanda

Sto cercando di utilizzare l'API di Google Drive attraverso il Identity dell'app < / A> Interfaccia fornita con Google App Engine. Questo consentono fondamentalmente la mia applicazione web di comunicare con le API di Google dal server al server .

Non ho bisogno dei miei utenti per accedere, ho semplicemente bisogno di visualizzare i miei documenti di Google Drive.

Tuttavia, dopo aver impostato tutti i valori e gli ambiti appropriati e abilitare tutte le manopole di guida di Google giuste sulla pagina della console, ottengo ancora questo per una semplice richiesta di ricezione di 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." }}
.

Cosa c'è che non va? Cosa mi manca? Ecco il codice che effettivamente la richiesta - cosa divertente è che funzioni fantastico se utilizzo altre API come l'API dell'ombrezzo dell'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());
.

Modifica

Se modifico semplicemente l'API per utilizzare l'API urlshortner ad esempio, funziona:

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

e output:

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

Quindi ci deve essere qualcosa che non funziona con Google Drive e Identity App?

Modifica 2

Ho trovato qualche aiuto dalla risposta corretta qui: https://stackoverflow.com/a/12526286/20394

Ma sta parlando di impostare gli ambiti API del client su Google Apps, e non sto usando Google Apps, sto semplicemente utilizzando il dominio del dominio del motore di Google APP foo.appspot.com

È stato utile?

Soluzione

L'errore 403 che stai ottenendo significa che non c'era nessuna intestazione di autorizzazione nel tuo successo.La logica è che senza un intestazione di autorizzazione, sei anonimo (sei Legion Blah Blah :-)).La quota di guida per uso anonimo è zero, da qui il messaggio.L'abbreviatore URL ha una quota superiore per anonimo, quindi funziona.

Ti suggerisco di modificare l'URL per indicare un server HTTP da solo e controllare quali intestazioni che stai effettivamente invio.

Altri suggerimenti

AFAICT È necessario utilizzare Bearer nell'intestazione di autorizzazione.

Probabilmente lo sta succedendo è che l'API Drive non riconosce l'account di servizio (a causa dell'intestazione sbagliata?) E prendendolo come una richiesta anonima poiché non è stato fornito alcun parametro key (vedere Common Query params ).

Prova questo:

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

O puoi provare ad aggiungere il token come parametro access_token Query.

Penso che dovresti almeno configurare una voce della console API con API Drive abilitato su https:// codice.google.com/apis/console . Una volta creato questo otterrai un ID che puoi usare nel tuo oggetto googlecreental.Dall'oggetto googlecreental puoi ottenere il token di accesso che è possibile aggiungere alla tua richiesta.

Cosa ho letto qui ( Google Drive tramite account di servizio ) Sei stato tuUtilizzare uno stile leggermente diverso che utilizza una chiave API che recupera dalla console sviluppatore.
Le parti pertinenti per me dovevano generare una "chiave per applicazioni server", quindi utilizzare questa tecnica, che non avevo letto da nessun'altra parte !

      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();
.

Questo risposta afferma che:

.

Gli account di servizio non sono supportati dall'interruzione SDK a causa del suo Modello di sicurezza.

Se è ancora vero, una soluzione alternativa è quella di eseguire una normale danza OAUTH una volta con un account Google regolare e persistono l'accesso e aggiornare il token nel datastore.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top