5

Attualmente sto implementando l'accesso a Contatti Google tramite OAuth 2.0 e un cosiddetto account di servizio. L'account di servizio viene generato per un utente normale come "[email protected]".Accesso ai contatti di Google Api tramite OAuth 2.0 e chiave privata alias Account di servizio

Il codice per generare il credenziali OAuth 2.0 è:

public static GoogleCredential getCredentials() throws GeneralSecurityException, IOException { 
    GoogleCredential credential = new GoogleCredential.Builder().setTransport(HTTP_TRANSPORT) 
      .setJsonFactory(JSON_FACTORY) 
      .setServiceAccountId(SingleUserCredentials.SERVICE_ACCOUNT_EMAIL) 
      .setServiceAccountScopes("https://www.google.com/m8/feeds") 
      .setServiceAccountPrivateKeyFromP12File(new File(SingleUserCredentials.SERVICE_ACCOUNT_PKCS12_FILE_PATH)) 
      .build(); 
    credential.refreshToken(); 
    return credential; 
} 

sto quindi cercando di recuperare i contatti tramite:

ContactsService myService = new ContactsService(
      "myApp"); 

    myService.setOAuth2Credentials(getCredentials()); 

    URL feedUrl = new URL("https://www.google.com/m8/feeds/contacts/default/full"); 
    Query myQuery = new Query(feedUrl); 
    ContactFeed resultFeed = myService.query(myQuery, ContactFeed.class); 
    // Print the results 

    for (ContactEntry entry : resultFeed.getEntries()) { 
     System.out.println(entry.getName().getFullName().getValue()); 
     System.out.println("Updated on: " + entry.getUpdated().toStringRfc822()); 
    } 

Il problema è che non ho ricevuto alcun un singolo contatto dal mio account. Il feed è sempre vuoto. Non c'è errore Niente.

Quando si accede a un dominio gestito di Google Apps tramite lo stesso approccio, funziona perfettamente.

Mi chiedo se Contact Api supporti OAuth 2.0 per account ordinari (ovvero @ gmail.com) quando si utilizza un file chiave p12 e un account di servizio.

risposta

1

Mi sono imbattuto in quello stesso problema io stesso.

Ho provato sia l'indirizzo di posta elettronica che ho ricevuto quando ho impostato la chiave e l'indirizzo di posta elettronica di un amministratore di dominio.

Quando uso l'e-mail dall'impostazione della chiave, non ricevo nulla - nessun avviso, nessuna eccezione e nessun dato.

Quando uso l'indirizzo email di un amministratore di dominio, ricevo un'eccezione:

com.google.api.client.auth.oauth2.TokenResponseException: 400 OK 
    [java] { 
    [java] "error" : "invalid_grant" 
    [java] } 
    [java] Feb 5, 2013 5:16:48 PM com.google.appengine.repackaged.org.apache.http.impl.client.DefaultRequestDirector handleResponse 
    [java] WARNING: Authentication error: Unable to respond to any of these challenges: {} 
    [java] Feb 5, 2013 5:16:48 PM com.google.apphosting.utils.jetty.JettyLogger warn 
    [java] WARNING:/
    [java] java.lang.NullPointerException: No authentication header information 

...

Così, ho pensato che l'indirizzo e-mail dell'amministratore del dominio non era quello che mi serviva .

Successivamente, ho Googled per un po 'prima di trovare questa pagina:

http://javadoc.google-api-java-client.googlecode.com/hg/1.13.2-beta/com/google/api/client/googleapis/auth/oauth2/GoogleCredential.html

ho visto in là getServiceAccountUser(). La descrizione del campo era:

Restituisce l'indirizzo di posta elettronica dell'utente che l'applicazione sta tentando di impersonare nel flusso di account del servizio o null per nessuno o se non utilizza il flusso di account del servizio.

Certo, c'è un setServiceAccountUser (String) corrispondente che accetta il nome utente (indirizzo email) dell'utente che si sta utilizzando l'account di servizio per impersonare.

Ho impostato tale campo su un valore appropriato e sono riuscito a procedere.

In retrospettiva, tutto ha senso - se non fornisco un account dal quale sto cercando di lavorare, non posso tirare giù i contatti per quell'account.

+0

Ehi Anonimo, grazie per la risposta. Tuttavia, stai descrivendo l'approccio per l'accesso OAuth 2.0 basato su chiave a un dominio. Questo funziona bene per me, come descritto sopra. Quello che cerco davvero è una soluzione per accedere ai contatti tramite un utente normale come [email protected] - senza un dominio gestito da Google. Spero che la mia domanda di cui sopra abbia senso al riguardo. –

0

Attualmente non è possibile accedere ai Contatti utilizzando un account di servizio poiché non è supportato nella Console delle API di Google al numero Google APIs Console.

Consulta anche: Service Accounts

In secondo luogo, che avrebbe funzionato solo con un gestito dominio Google perché l'amministratore del dominio deve concedere l'accesso all'account di servizio attraverso il processo di seguito: a livello di dominio

Delegato autorizzazione al tuo account di servizio

L'account di servizio che hai creato ora deve essere concesso l'accesso ai dati utente del dominio Google Apps a cui desideri accedere. Le seguenti operazioni devono essere eseguite da un amministratore del dominio Google Apps:

  1. Vai al pannello di controllo del tuo dominio Google Apps. L'URL dovrebbe avere il seguente aspetto: "www.google.com/a/cpanel/mydomain.com"

  2. Vai a Strumenti avanzati ...> Gestisci l'accesso client OAuth di terze parti.

  3. Nel campo Nome cliente immettere l'ID cliente dell'account di servizio.

  4. Nel campo Uno o più campi API immettere l'elenco di ambiti a cui deve essere concesso l'accesso alla propria applicazione.

  5. Fare clic sul pulsante Autorizza.

+0

Non sono sicuro se posso essere d'accordo. L'API Contatti non è disponibile in API Console dei domini, ma funziona su domini. Quindi, teoricamente, dovrebbe funzionare anche su normali account Gmail. E per quanto riguarda i conti di servizio - quel concetto funziona per account singoli. L'abbiamo testato con Calendar Api e Drive. E infine - la cosa davvero strana è che non riceviamo alcun messaggio di errore. Non riceviamo dati. Sembra più un insetto? –

+0

Ho provato questo approccio prima di trovare questa risposta ma per me non funziona. Sto usando - come ambito - 'https: // www.google.com/m8/feeds '(contatti R/W) ma senza gioia. Ho notato che gli ambiti per i servizi vengono "riconosciuti" e il loro nome descrittivo viene visualizzato accanto all'URI, ma ciò non accade con il precedente. Sospetto che sia semplicemente non supportato. – mac

+0

@mac Ho avuto la stessa cosa con questo URL non riconosciuto. Tuttavia se aggiungi una barra alla fine, viene riconosciuta. (senza fortuna con in realtà chiamare l'API però ...) – Geert

0

ho eseguito in questo stesso errore oggi, ma ho rinunciato a utilizzare account di servizio per il momento, che presumo non è attualmente supportata nella API dei contatti. E così sto usando Contacts API v3 con OAuth 1.0 e sto ottenendo i risultati attesi.

ContactsService contactsService = new ContactsService(APPLICATION_NAME); 
contactsService.setUserCredentials(CLIENT_USERNAME, CLIENT_SECRET); 

URL contactFeedURL = new URL("https://www.google.com/m8/feeds/contacts/default/full"); 
Query contactFeedQuery = new Query(contactFeedURL); 

ContactFeed contactFeed = contactsService.getFeed(contactFeedQuery, ContactFeed.class); 
+0

Grazie :) Buono a sapersi. OAuth 1.0 funziona anche per noi. OAuth 2.0 continua a non funzionare con il certificato p12 ... –

+0

Speriamo che sarà supportato abbastanza presto. So che questo non ha risposto alla tua domanda, ma ho pensato che potesse essere utile a qualcuno che cercava di mettersi in contatto con i Contatti. – rposky