2017-05-02 4 views
1

Ich versuche, nach Änderungen in Google Drive zu suchen und 401 Exception zu erhalten. Wenn ich hier suche, finde ich, dass Leute detaillierte Nachrichten haben, warum sie nicht unautorisiert sind, obwohl ich nichts habe.drive.changes(). Watch gibt GoogleJsonResponseException zurück: 401 Nicht autorisiert ohne Nachricht

Hier ist der Code, den ich verwenden:

public static void main(String[] args) { 
    try { 


     httpTransport = GoogleNetHttpTransport.newTrustedTransport(); 
     dataStoreFactory = new FileDataStoreFactory(DATA_STORE_DIR); 

     // authorization 
     GoogleCredential credential = GoogleCredential.getApplicationDefault() 
       .createScoped(DriveScopes.all()); 

     boolean refreshed = credential.refreshToken(); 

     // set up the global Drive instance 
     drive = new Drive.Builder(httpTransport, JSON_FACTORY, credential) 
       .setApplicationName(APPLICATION_NAME) 
       .build(); 

     Channel channel = new Channel(); 
     channel.setId(UUID.randomUUID().toString()); 
     channel.setType("web_hook"); 
     //my ip here 
     channel.setAddress("https://com.example:"); 

     StartPageToken pageToken = drive.changes().getStartPageToken().execute(); 
     System.out.println(pageToken.getStartPageToken()); 
     Channel changesChannel = drive.changes().watch(pageToken.getStartPageToken(), channel).execute(); 
     System.out.println(changesChannel.getExpiration()); 

     return; 
    } catch (IOException e) { 
     System.err.println(e.getMessage()); 
     e.printStackTrace(); 
    } catch (Throwable t) { 
     t.printStackTrace(); 
    } 
    System.exit(1); 
} 

Weitere Informationen:

  1. Dies ist ein Dienstkonto. Es verfügt über Berechtigungen Besitzer
  2. ich es von lokalen Computer
  3. drive.files() bin mit. List() funktioniert
  4. drive.about(). Get() funktioniert gut

Und die Ausnahme ich erhalte:

com.google.api.client.googleapis.json.GoogleJsonResponseException: 401 Unauthorized bei com.google.api.client.googleapis.json.GoogleJsonResponseException.from (GoogleJsonResponseException.java : 145) bei com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError (AbstractGoogleJsonClientRequest.java:113) bei com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError (AbstractGoogleJsonClientRequest.java: 40) bei com.google.api.client.googleapis.services.AbstractGoogleClientRequest $ 1.interceptResponse (AbstractGoogleClientRequest.java:321) bei com.google.api.client.http.HttpRequest.execute (HttpRequest.java:1065) bei com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed (AbstractGoogleClientRequest.java:419) bei com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed (AbstractGoogleClientRequest.java:352) bei com .google.api.client.googleapis.s ervices.AbstractGoogleClientRequest.execute (AbstractGoogleClientRequest.java:469) bei main.lambda.GoogleDrive2.main (MyClass.java:142)

meine pom.xml Abhängigkeiten:

<dependency> 
     <groupId>com.google.api-client</groupId> 
     <artifactId>google-api-client</artifactId> 
     <version>1.20.0</version> 
    </dependency> 
    <dependency> 
     <groupId>com.google.oauth-client</groupId> 
     <artifactId>google-oauth-client</artifactId> 
     <version>1.22.0</version> 
    </dependency> 
    <!-- https://mvnrepository.com/artifact/com.google.api-client/google-api-client-extensions --> 
    <dependency> 
     <groupId>com.google.api-client</groupId> 
     <artifactId>google-api-client-extensions</artifactId> 
     <version>1.6.0-beta</version> 
    </dependency> 
    <dependency> 
     <groupId>com.google.oauth-client</groupId> 
     <artifactId>google-oauth-client-jetty</artifactId> 
     <version>1.22.0</version> 
    </dependency> 
    <dependency> 
     <groupId>com.google.apis</groupId> 
     <artifactId>google-api-services-drive</artifactId> 
     <version>v3-rev70-1.22.0</version> 
    </dependency> 
+0

Der Code, den Sie verwenden, sieht für mich wie Oauth2 und nicht Dienstkonto aus. Bitte geben Sie Ihren Authentifizierungscode für das Dienstkonto ein. Dies ist eine Analyse, die jedoch als Referenz dienen könnte https://developers.google.com/analytics/devguides/reporting/core/v3/quickstart/service-java – DaImTo

+0

hi @DaImTo Dies ist ein Dienstkonto. Ich habe dies verwendet: ➜ ~ gcloud auth activate-service-account --key-file =/pfad/zu/meine/datei um es lokal zu aktivieren, und danach mit GoogleCredential.getApplicationDefault() .. es dauert diese anmeldedaten – Saandji

+0

Können Sie etwas Einfaches wie eine Dateiliste versuchen? Ich denke, das ist ein Berechtigungsproblem, auf das Ihr Dienstkonto keinen Zugriff hat, um diese Datei anzusehen. – DaImTo

Antwort

0

Nachdem er einige Stunden und Lesen der Dokumentation, habe ich endlich das Problem gefunden.

Wie in Push Notification doc geschrieben (https://developers.google.com/drive/v3/web/push):

Um Push-Benachrichtigungen zu verwenden, müssen Sie drei Dinge tun:

  1. die Domäne Ihres Empfangens URL registrieren. ...

  2. Richten Sie Ihre Empfangs-URL oder den "Webhook" -Rückrufempfänger ein.

    Dies ist ein HTTPS-Server, der die API-Benachrichtigungen verarbeitet, die ausgelöst werden, wenn sich eine Ressource ändert.

  3. Richten Sie einen Benachrichtigungskanal für jeden Ressourcenendpunkt ein, den Sie überwachen möchten.

    Ein Kanal gibt Routinginformationen für Benachrichtigungsmeldungen an. Im Rahmen des Channel-Setups identifizieren Sie die spezifische URL, an die Sie Benachrichtigungen erhalten möchten. Wenn sich die Ressource eines Kanals ändert, sendet die Drive API eine Benachrichtigung als POST-Anfrage an diese URL.

Was bedeutet, Sie eine Domain haben sollte und Sie sollten es bei Google bestätigen, bevor Sie Uhr API verwenden können.

P.S. Ich denke immer noch, dass die Antwort GoogleJsonResponseException: 401 Unauthorized in diesem Fall lächerlich ist, aber hoffe, es wird anderen helfen, die das gleiche Problem haben.

Verwandte Themen