2014-09-17 24 views
13

Mi sento in imbarazzo che sto semplicemente non riuscendo con un esempio pezzo di codice, ma io la colpa sul fatto che è tardi ...GmailApiQuickstart -

ho preso una copia e incolla di: https://developers.google.com/gmail/api/quickstart/quickstart-java e scaricate le librerie client: https://code.google.com/p/google-api-java-client/ e https://developers.google.com/api-client-library/java/apis/gmail/v1

Quando eseguo il campione, ottengo la seguente eccezione:

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) 

Googling, non riesco a trovare una risposta semplice, quindi un m assumendo stupidità o una biblioteca mancante/errata.

Le librerie come li ho sono:

/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 

L'esempio di cui sopra:

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

} 

ho sostituito il riferimento a CLIENT_SECRET_PATH con:

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

per nessun altro motivo che provare qualcosa di diverso. Funziona e legge correttamente il file.

Qualche idea?

risposta

45

Giusto, dopo qualche ricerca in più (chiedendo a un collega/genio), ho trovato il problema. Fondamentalmente l'oggetto GoogleClientSecrets non era correttamente associato alle informazioni del mio file client_secrets.json. Ciò significava che durante l'autenticazione, gli oggetti erano null con conseguente IllegalArgumentException.

Così il file originale che si presentava così:

{ 
     "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" 
} 

è stato modificato per assomigliare a questo:

{ 
    "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" 
    } 
} 

Questo mi ha permesso di progredire attraverso il codice con l'autenticazione.

Spero che questo aiuti.

+0

Sì, estremamente utile. Grazie! –

+2

Exxxxtremelyyy helpul ... grazie! come l'hai scoperto? Voglio dire, perché mettere questo "web" risolve. –

+2

Problema simile. Il file originale è stato generato su Google Console con un "account di servizio". Il file json non ha elementi "web" e costruisce i flussi di flusso. Rigenerare le credenziali usando "web" anziché "account di servizio" fornisce una struttura che include "web" e il "flusso" costruito. – Glenn

2

ecco un esempio di lavoro di autenticazione non interattiva per Google Non-interactive authorization with Google OAuth2 il problema non è nel tag "web" in JSON client, ma piuttosto nel fatto che il loro esempio è per l'autenticazione web durante il loro modo suggerito di generare le credenziali sono per "account di servizio" non interattivo. hanno più problemi con la loro documentazione.