Frage

Ich versuche, die Google Drive-API über zu verwenden App-Identität Schnittstelle, die mit Google App Engine bereitgestellt wird.Dadurch kann meine Webanwendung grundsätzlich mit den APIs von Google kommunizieren von Server zu Server.

Meine Benutzer müssen sich nicht anmelden, ich muss lediglich meine eigenen Google Drive-Dokumente anzeigen.

Nachdem ich jedoch alle entsprechenden Werte und Bereiche festgelegt und alle richtigen Google Drive-Regler auf der Konsolenseite aktiviert habe, erhalte ich dies immer noch für eine einfache GET-Anfrage 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." }}

Was ist falsch?Was vermisse ich?Hier ist der Code, der die Anfrage tatsächlich ausführt. Das Lustige ist, dass er großartig funktioniert, wenn ich andere APIs wie die URL-Shortener-API verwende:

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

BEARBEITEN

Wenn ich einfach die API ändere, um die zu verwenden urlshortner API zum Beispiel, es funktioniert:

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

Und Ausgabe:

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

Es muss also etwas vorliegen, das mit Google Drive und App Identity nicht funktioniert?

BEARBEITEN 2

Ich habe hier etwas Hilfe bei der richtigen Antwort gefunden: https://stackoverflow.com/a/12526286/50394

Aber es geht darum, Client-API-Bereiche in Google Apps festzulegen, und ich verwende nicht Google Apps, sondern einfach die Domäne von Google App Engine foo.appspot.com

War es hilfreich?

Lösung

Der Fehler 403, den Sie erhalten, bedeutet, dass Ihr GET keinen Autorisierungsheader enthielt.Die Logik ist, dass Sie ohne Authorization-Header anonym sind (Sie sind Legion, bla bla :-)).Das Drive-Kontingent für die anonyme Nutzung ist Null, daher die Meldung.Der URL-Shortener hat ein höheres Kontingent für Anonymität, sodass er funktioniert.

Ich schlage vor, dass Sie die URL so ändern, dass sie auf einen eigenen http-Server verweist, und überprüfen, welche Header Sie tatsächlich senden.

Andere Tipps

AFAICT, das Sie verwenden sollten Bearer im Autorisierungsheader.

Wahrscheinlich liegt es daran, dass die Drive-API das Dienstkonto nicht erkennt (wegen des falschen Headers?) und es daher als anonyme Anfrage betrachtet, da nein key Parameter wurde ebenfalls nicht bereitgestellt (siehe allgemeine Abfrageparameter).

Versuche dies:

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

Oder Sie könnten versuchen, das Token als hinzuzufügen access_token Abfrageparameter.

Ich denke, Sie sollten zumindest einen API-Konsoleneintrag mit aktivierter Drive-API unter einrichten https://code.google.com/apis/consoleSobald Sie dies erstellt haben, erhalten Sie eine ID, die Sie in Ihrem GoogleCredential-Objekt verwenden können.Vom GoogleCredential-Objekt können Sie das Zugriffstoken abrufen, das Sie dann Ihrer Anfrage hinzufügen können.

Was ich hier gelesen habe (Google Drive über Dienstkonten) bestand darin, dass Sie einen etwas anderen Stil verwenden, der einen API-SCHLÜSSEL verwendet, den Sie aus der Entwicklerkonsole abrufen.
Die relevanten Teile für mich bestanden darin, einen „Schlüssel für Serveranwendungen“ zu generieren und dann diese Technik zu verwenden, die ich nicht gelesen hatte irgendwo anders!

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

Das Antwort behauptet, dass:

Servicekonten werden aufgrund seines Sicherheitsmodells vom Drive SDK nicht unterstützt.

Wenn das immer noch zutrifft, besteht eine Lösung darin, einmal einen regulären OAuth-Tanz mit einem regulären Google-Konto durchzuführen und das Zugriffs- und Aktualisierungstoken im Datenspeicher beizubehalten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top