title: "401 Unauthorized" when trying to watch changes on Google Drive with Java API Client
body: <p>Really stuck here. The code, built from examples provided by Google:</p>
  
  <pre><code>public static void main(String[] args) {
      try {
          HttpTransport httpTransport = new NetHttpTransport();
          JsonFactory jsonFactory = new JacksonFactory();
  
      GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
              httpTransport, jsonFactory, CLIENT_ID, CLIENT_SECRET, Arrays.asList(DriveScopes.DRIVE))
              .setAccessType("online")
              .setApprovalPrompt("auto")
              .build();
  
      String url = flow.newAuthorizationUrl().setRedirectUri(REDIRECT_URI).build();
      System.out.println("Please open the following URL in your browser then type the authorization code:");
      System.out.println("  " + url);
      BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
      String code = br.readLine();
  
      GoogleTokenResponse response = flow.newTokenRequest(code).setRedirectUri(REDIRECT_URI).execute();
      GoogleCredential credential = new GoogleCredential().setFromTokenResponse(response);
  
      //Create a new authorized API client
      Drive service = new Drive.Builder(httpTransport, jsonFactory, credential).setApplicationName("Google Push").build();
  
      //Insert a file
      File body = new File();
      body.setTitle("My document");
      body.setDescription("A test document");
      body.setMimeType("text/plain");
  
      java.io.File fileContent = new java.io.File("document.txt");
      BufferedWriter bw = new BufferedWriter(new FileWriter(fileContent));
      bw.write("allo!!!!");
      bw.close();
  
      System.out.println("file created? -&gt; " + fileContent.createNewFile());
      FileContent mediaContent = new FileContent("text/plain", fileContent);
  
      File file = service.files().insert(body, mediaContent).execute();
      System.out.println("File ID: " + file.getId());
  
      watchChange(service, "channelId", "web_hook", "https://clementlevallois.net/notifications"); // line 78
  
  } catch (IOException ex) {
      Logger.getLogger(DriveCommandLine.class.getName()).log(Level.SEVERE, null, ex);
  }
  
  }
  
  private static Channel watchChange(Drive service, String channelId, String channelType, String channelAddress) {
  
      Channel channel = new Channel();
      channel.setId(channelId);
      channel.setType(channelType);
      channel.setAddress(channelAddress);
      try {
          return service.changes().watch(channel).execute(); //line 91
      } catch (IOException e) {
          e.printStackTrace();
      }
      return null;
  }
  </code></pre>
  
  <p>The stack trace:</p>
  
  <pre><code>com.google.api.client.googleapis.json.GoogleJsonResponseException: 401 Unauthorized
      at com.google.api.client.googleapis.json.GoogleJsonResponseException.from(GoogleJsonResponseException.java:145)
      at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:113)
      at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:40)
      at com.google.api.client.googleapis.services.AbstractGoogleClientRequest$1.interceptResponse(AbstractGoogleClientRequest.java:312)
      at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:1049)
      at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:410)
      at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:343)
      at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:460)
      at Controller.DriveCommandLine.watchChange(DriveCommandLine.java:91)
      at Controller.DriveCommandLine.main(DriveCommandLine.java:78)
  </code></pre>