title: Gmail API's Java integration issue
body: <p>I'm involved in a develop that lead me to integrate Gmail API in my Java project.</p>
  
  <p>Like everybody I started my test bringing the <a href="https://developers.google.com/gmail/api/quickstart/java" rel="nofollow">GmailQuickstart</a> example provided in the official documentation.</p>
  
  <p>I perform a few test on it but I'm not able to login and list labels of my account.</p>
  
  <p>This is my class : </p>
  
  <pre><code>import java.io.IOException;
  import java.io.InputStream;
  import java.io.InputStreamReader;
  import java.util.Arrays;
  import java.util.List;
  
  import com.google.api.client.auth.oauth2.Credential;
  import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets;
  import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
  import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
  import com.google.api.client.http.HttpTransport;
  import com.google.api.client.json.JsonFactory;
  import com.google.api.client.json.jackson2.JacksonFactory;
  import com.google.api.client.util.store.FileDataStoreFactory;
  import com.google.api.services.gmail.Gmail;
  import com.google.api.services.gmail.GmailScopes;
  import com.google.api.services.gmail.model.Label;
  import com.google.api.services.gmail.model.ListLabelsResponse;
  
  public class ComunicoTestSergio {
  
      private static HttpTransport HTTP_TRANSPORT;
      private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();
      private static final java.io.File DATA_STORE_DIR = new java.io.File(System.getProperty("user.home"), ".credentials/ComunicoTestSergio.json");
      private static FileDataStoreFactory DATA_STORE_FACTORY;
      private static final String APPLICATION_NAME ="comunico";
  
      static {
          try {
              HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
              DATA_STORE_FACTORY = new FileDataStoreFactory(DATA_STORE_DIR);
          } catch (Throwable t) {
              t.printStackTrace();
              System.exit(1);
          }
      }
      public static Credential authorize() throws IOException {
          InputStream is = ComunicoTestSergio.class.getResourceAsStream(
                  "/comunico-test-sergio-client_secret_113926736970383780927.json");
          InputStreamReader isr = new InputStreamReader(is);
          GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, isr);           
          Credential credential = new GoogleCredential.Builder()
                  .setTransport( HTTP_TRANSPORT )
                  .setJsonFactory( JSON_FACTORY )
                  .setServiceAccountId( "comunico-test-sergio comunico-test-sergio@comunico-1266.iam.gserviceaccount.com" ) 
                  .setServiceAccountScopes( Arrays.asList(GmailScopes.GMAIL_LABELS) )
                  .setServiceAccountUser( "otticanet.ad@gmail.com" )
                  .setClientSecrets( clientSecrets )
                  .build();
          return credential;
      }
      public static Gmail getGmailService() throws Exception {
          Credential credential = authorize();
          return new Gmail.Builder( HTTP_TRANSPORT, JSON_FACTORY, credential )
                  .setApplicationName( APPLICATION_NAME )
                  .build();
      }
  
      public static void main(String[] args) {
          try {
              Gmail service = getGmailService();
              String user = "me";
              ListLabelsResponse listResponse =service.users().labels().list(user).execute();
              List&lt;Label&gt; labels = listResponse.getLabels();
              if (labels.size() == 0) { System.out.println("No labels found."); } 
              else {
                  System.out.println("Labels:");
                  for (Label label : labels) {
                      System.out.printf("- %s\n", label.getName());
                  }
              }
          } catch ( Exception ex ) {
              ex.printStackTrace();
          }
      }
  }
  </code></pre>
  
  <p>This is my maven pom dependencies list : </p>
  
  <pre><code>&lt;dependency&gt;
        &lt;groupId&gt;com.google.apis&lt;/groupId&gt;
        &lt;artifactId&gt;google-api-services-gmail&lt;/artifactId&gt;
        &lt;version&gt;v1-rev40-1.21.0&lt;/version&gt;
      &lt;/dependency&gt;
    &lt;/dependencies&gt;
  </code></pre>
  
  <p>That generate this dependencies set : </p>
  
  <pre><code>/home/sbelli/.m2/repository/com/google/apis/google-api-services-gmail/v1-rev40-1.21.0/google-api-services-gmail-v1-rev40-1.21.0.jar
  /home/sbelli/.m2/repository/com/google/api-client/google-api-client/1.21.0/google-api-client-1.21.0.jar
  /home/sbelli/.m2/repository/com/google/oauth-client/google-oauth-client/1.21.0/google-oauth-client-1.21.0.jar
  /home/sbelli/.m2/repository/com/google/http-client/google-http-client/1.21.0/google-http-client-1.21.0.jar
  /home/sbelli/.m2/repository/org/apache/httpcomponents/httpclient/4.0.1/httpclient-4.0.1.jar
  /home/sbelli/.m2/repository/org/apache/httpcomponents/httpcore/4.0.1/httpcore-4.0.1.jar
  /home/sbelli/.m2/repository/commons-logging/commons-logging/1.1.1/commons-logging-1.1.1.jar
  /home/sbelli/.m2/repository/commons-codec/commons-codec/1.3/commons-codec-1.3.jar
  /home/sbelli/.m2/repository/com/google/code/findbugs/jsr305/1.3.9/jsr305-1.3.9.jar
  /home/sbelli/.m2/repository/com/google/http-client/google-http-client-jackson2/1.21.0/google-http-client-jackson2-1.21.0.jar
  /home/sbelli/.m2/repository/com/fasterxml/jackson/core/jackson-core/2.1.3/jackson-core-2.1.3.jar
  /home/sbelli/.m2/repository/com/google/guava/guava-jdk5/17.0/guava-jdk5-17.0.jar
  </code></pre>
  
  <p>This is my JSON credential file (downloaded from Google Developer Console) : </p>
  
  <pre>
  
      {
      "installed":{
       "client_id":"my_client_id_x",
       "project_id":"my_project_id",
       "auth_uri":"https://accounts.google.com/o/oauth2/auth",
       "token_uri":"https://accounts.google.com/o/oauth2/token",
       "auth_provider_x509_cert_url":"https://www.googleapis.com/oauth2/v1/certs"
       }
      }
  
  </pre>
  
  <p>When i run my example class i obtain this issue : </p>
  
  <pre><code>java.lang.IllegalArgumentException
      at com.google.api.client.repackaged.com.google.common.base.Preconditions.checkArgument(Preconditions.java:111)
      at com.google.api.client.util.Preconditions.checkArgument(Preconditions.java:37)
      at com.google.api.client.googleapis.auth.oauth2.GoogleCredential.&lt;init&gt;(GoogleCredential.java:317)
      at com.google.api.client.googleapis.auth.oauth2.GoogleCredential$Builder.build(GoogleCredential.java:515)
      at it.trew.comunico.business.test.ComunicoTestSergio.authorize(ComunicoTestSergio.java:51)
      at it.trew.comunico.business.test.ComunicoTestSergio.getGmailService(ComunicoTestSergio.java:55)
      at it.trew.comunico.business.test.ComunicoTestSergio.main(ComunicoTestSergio.java:63)
  </code></pre>
  
  <p>If i comment the lines : </p>
  
  <ul>
  <li>.setServiceAccountId( "comunico-test-sergio comunico-test-sergio@comunico-1266.iam.gserviceaccount.com" )</li>
  <li>.setServiceAccountScopes( Arrays.asList(GmailScopes.GMAIL_LABELS) )</li>
  <li>.setServiceAccountUser( "otticanet.ad@gmail.com" )</li>
  </ul>
  
  <p>i obtain the issue</p>
  
  <pre><code>com.google.api.client.googleapis.json.GoogleJsonResponseException: 401 Unauthorized
  {
    "code" : 401,
    "errors" : [ {
      "domain" : "global",
      "location" : "Authorization",
      "locationType" : "header",
      "message" : "Login Required",
      "reason" : "required"
    } ],
    "message" : "Login Required"
  }
      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:321)
      at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:1056)
      at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:419)
      at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:352)
      at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:469)
      at it.trew.comunico.business.test.ComunicoTestSergio.main(ComunicoTestSergio.java:65)
  </code></pre>
  
  <p>What's the matter?! I follow step by step the online tutorial... :(</p>
  
  <p>Every help is appreciate!</p>