para library home google for developers apis java gmail google-api-java-client

library - google home api java



GmailApiQuickstart- (2)

Me avergüenzo de estar simplemente fallando con un ejemplo de código, pero lo culpo por el hecho de que es tarde ...

He tomado una copia y pegado de: https://developers.google.com/gmail/api/quickstart/quickstart-java y descargué las bibliotecas del cliente: https://code.google.com/p/google-api-java-client/ y https://developers.google.com/api-client-library/java/apis/gmail/v1

Cuando ejecuto el ejemplo, obtengo la siguiente excepción:

Exception in thread "main" java.lang.IllegalArgumentException at com.google.api.client.repackaged.com.google.common.base.Preconditions.checkArgument(Preconditions.java:76) at com.google.api.client.util.Preconditions.checkArgument(Preconditions.java:37) at com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets.getDetails(GoogleClientSecrets.java:82) at com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow$Builder.<init>(GoogleAuthorizationCodeFlow.java:195) at com.emailreply.musterion.GmailApiQuickstart.main(GmailApiQuickstart.java:40)

En Google, no puedo encontrar una respuesta simple, por lo que estoy asumiendo que es una estupidez o que falta una biblioteca / incorrecta.

Las bibliotecas como las tengo son:

/libs/commons-logging-1.1.1.jar /libs/google-api-client-1.19.0.jar /libs/google-api-client-android-1.19.0.jar /libs/google-api-client-appengine-1.19.0.jar /libs/google-api-client-gson-1.19.0.jar /libs/google-api-client-jackson2-1.19.0.jar /libs/google-api-client-java6-1.19.0.jar /libs/google-api-client-servlet-1.19.0.jar /libs/google-http-client-1.19.0.jar /libs/google-http-client-android-1.19.0.jar /libs/google-http-client-appengine-1.19.0.jar /libs/google-http-client-gson-1.19.0.jar /libs/google-http-client-jackson2-1.19.0.jar /libs/google-http-client-jdo-1.19.0.jar /libs/google-oauth-client-1.19.0.jar /libs/google-oauth-client-appengine-1.19.0.jar /libs/google-oauth-client-java6-1.19.0.jar /libs/google-oauth-client-jetty-1.19.0.jar /libs/google-oauth-client-servlet-1.19.0.jar /libs/gson-2.1.jar /libs/httpclient-4.0.1.jar /libs/httpcore-4.0.1.jar /libs/jackson-core-2.1.3.jar /libs/jdo2-api-2.3-eb.jar /libs/jetty-6.1.26.jar /libs/jetty-util-6.1.26.jar /libs/jsr305-1.3.9.jar /libs/transaction-api-1.1.jar google-api-services-gmail-v1-rev10-1.19.0.jar

El ejemplo mencionado anteriormente:

import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Arrays; import java.util.List; import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow; import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets; import com.google.api.client.googleapis.auth.oauth2.GoogleCredential; import com.google.api.client.googleapis.auth.oauth2.GoogleOAuthConstants; import com.google.api.client.googleapis.auth.oauth2.GoogleTokenResponse; import com.google.api.client.http.HttpTransport; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.JsonFactory; import com.google.api.client.json.jackson2.JacksonFactory; import com.google.api.services.gmail.Gmail; import com.google.api.services.gmail.model.ListThreadsResponse; import com.google.api.services.gmail.model.Thread; public class GmailApiQuickstart { // Check https://developers.google.ciom/gmail/api/auth/scopes for all available scopes private static final String SCOPE = "https://www.googleapis.com/auth/gmail.readonly"; private static final String APP_NAME = "Gmail API Quickstart"; // Email address of the user, or "me" can be used to represent the currently authorized user. private static final String USER = "me"; // Path to the client_secret.json file downloaded from the Developer Console private static final String CLIENT_SECRET_PATH = "./client_secret.json"; public static void main (String [] args) throws IOException { HttpTransport httpTransport = new NetHttpTransport(); JsonFactory jsonFactory = new JacksonFactory(); GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(jsonFactory, new BufferedReader(new InputStreamReader(GmailApiQuickstart.class.getResourceAsStream(CLIENT_SECRET_PATH)))); // Allow user to authorize via url. GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder( httpTransport, jsonFactory, clientSecrets, Arrays.asList(SCOPE)) .setAccessType("online") .setApprovalPrompt("auto").build(); String url = flow.newAuthorizationUrl().setRedirectUri(GoogleOAuthConstants.OOB_REDIRECT_URI).build(); System.out.println("Please open the following URL in your browser then type the authorization code:/n" + url); // Read code entered by user. BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String code = br.readLine(); // Generate Credential using retrieved code. GoogleTokenResponse response = flow.newTokenRequest(code) .setRedirectUri(GoogleOAuthConstants.OOB_REDIRECT_URI).execute(); GoogleCredential credential = new GoogleCredential() .setFromTokenResponse(response); // Create a new authorized Gmail API client Gmail service = new Gmail.Builder(httpTransport, jsonFactory, credential) .setApplicationName(APP_NAME).build(); // Retrieve a page of Threads; max of 100 by default. ListThreadsResponse threadsResponse = service.users().threads().list(USER).execute(); List<Thread> threads = threadsResponse.getThreads(); // Print ID of each Thread. for (Thread thread : threads) { System.out.println("Thread ID: " + thread.getId()); } } }

Reemplazé la referencia a CLIENT_SECRET_PATH con:

new BufferedReader(new InputStreamReader(GmailApiQuickstart.class.getResourceAsStream(CLIENT_SECRET_PATH)))

por ninguna otra razón que para probar algo diferente. Funciona y lee el archivo correctamente.

¿Algunas ideas?


Correcto, después de un poco más de investigación (preguntando a un colega / genio), encontré el problema. Básicamente, el objeto GoogleClientSecrets no se estaba GoogleClientSecrets correctamente con la información de mi archivo client_secrets.json . Esto significaba que durante la autenticación, los objetos eran null lo que IllegalArgumentException resultado la IllegalArgumentException .

Así que el archivo original que se veía así:

{ "private_key_id": "zzz", "private_key": "-----BEGIN PRIVATE KEY-----/nxyz/n-----END PRIVATE KEY-----/n", "client_email": "[email protected]", "client_id": "1wdfghyjmp.apps.googleusercontent.com", "type": "service_account" }

fue editado para parecerse a esto:

{ "web" : { "private_key_id": "zzz", "private_key": "-----BEGIN PRIVATE KEY-----/nxyz/n-----END PRIVATE KEY-----/n", "client_email": "[email protected]", "client_id": "1wdfghyjmp.apps.googleusercontent.com", "type": "service_account" } }

Esto me permitió progresar a través del código con autenticación.

Espero que esto ayude.


Este es un ejemplo práctico de autenticación no interactiva para Google. Autorización no interactiva con Google OAuth2. El problema no está en la etiqueta "web" en el cliente json, sino en el hecho de que su ejemplo es para la autenticación web, mientras que su forma sugerida de la generación de credenciales es para la "cuenta de servicio" no interactiva. Tienen múltiples problemas con su documentación.