2017-05-02 8 views
1

J'essaie de surveiller les modifications dans Google Drive et d'obtenir l'exception 401. En cherchant ici, j'ai trouvé que les gens ont des messages détaillés, pourquoi ils ne sont pas non autorisés bien que je n'ai rien.drive.changes(). Watch returns GoogleJsonResponseException: 401 Non autorisé sans aucun message

Voici le code i utiliser:

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

Plus d'infos:

  1. Ceci est un compte de service. Il dispose des autorisations de propriétaire
  2. Je l'utilise depuis l'ordinateur local
  3. drive.files(). Liste() fonctionne très bien
  4. drive.about(). Get() fonctionne très bien

Et l'exception que je reçois:

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

mes dépendances pom.xml:

<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

Le code que vous utilisez ressemble à Oauth2 et ne compte pas de service pour moi. Veuillez inclure votre code d'autorisation pour le compte de service. Il s'agit d'un outil d'analyse, mais il peut être utile en tant que référence https://developers.google.com/analytics/devguides/reporting/core/v3/quickstart/service-java – DaImTo

+0

hi @DaImTo Il s'agit d'un compte de service. J'ai utilisé ceci: ➜ ~ gcloud auth activer-service-compte --key-fichier =/chemin/vers/mon/fichier pour l'activer localement, et après cela avec GoogleCredential.getApplicationDefault() .. il prend ces informations d'identification – Saandji

+0

Pouvez-vous essayer quelque chose de simple comme une liste de fichiers. Je pense que c'est un problème d'autorisations que votre compte de service n'a pas accès à regarder ce fichier. – DaImTo

Répondre

0

Après avoir passé quelques heures et lire plus attentivement la documentation, j'ai enfin trouvé le problème.

Comme écrit dans la notification push doc (https://developers.google.com/drive/v3/web/push):

Pour utiliser les notifications push, vous devez faire trois choses:

  1. enregistrer le domaine de l'URL de votre réception. ...

  2. Configurez votre URL de réception, ou récepteur de rappel "Webhook".

    Il s'agit d'un serveur HTTPS qui gère les messages de notification d'API qui sont déclenchés lorsqu'une ressource est modifiée.

  3. Configurez un canal de notification pour chaque noeud final de ressource que vous souhaitez regarder.

    Un canal spécifie des informations de routage pour les messages de notification. Dans le cadre de la configuration de la chaîne, vous identifiez l'URL spécifique à laquelle vous souhaitez recevoir des notifications. Chaque fois que la ressource d'un canal change, l'API Drive envoie un message de notification en tant que requête POST à ​​cette URL.

Ce qui signifie que vous devriez avoir un domaine et vous devez confirmer à Google, avant de pouvoir utiliser l'API de la montre.

P.S. Je pense toujours que la réponse GoogleJsonResponseException: 401 Unauthorized est ridicule dans ce cas, mais j'espère que cela aidera d'autres qui font face au même problème.