Comment accéder à Google Agenda REST API v3 avec Java


Je travaille sur un projet où je dois accéder à un ensemble de calendriers Google en utilisant REST et en travaillant avec Java.

Le programme, situé sur un serveur privé non-Google, se connecte périodiquement (via cron job) au compte Google, obtient la liste des calendriers liés au compte, obtient les événements du dernier mois de chaque calendrier et renvoie un fichier XML contenant toutes les informations. Le programme doit pouvoir exécuter et accéder aux calendriers SANS aucune entrée utilisateur. Pour le moment, le project spécifie que le calendrier sera simplement lu, pas modifié (donc seuls les appels GET/LIST seront effectués).

J'ai parcouru la documentation Google et parcouru les exemples de codes à l'aide des bibliothèques clientes, et presque tous les exemples donnés nécessitent le consentement de l'utilisateur OAuth 2.0 avant d'accéder à l'API de calendrier. Même les pages de documentation de l'API REST nécessitent que vous activiez OAuth 2.0 pour renvoyer les informations demandées (sinon, renvoyez un code d'erreur HTTP 40X et un fichier JSON contenant l'état d'erreur et message).

Comment puis-je me connecter à l'API REST de Google Agenda pour obtenir les informations dont j'ai besoin, tout étant fait via des appels REST, et sans nécessiter le consentement de l'utilisateur au moment de l'exécution?

Ou est-ce que je complique trop les choses, et n'ai besoin que de la "clé de serveur", trouvée dans la partie Applications Resgistered de la console Google Cloud?
Ou dois-je utiliser à la fois la clé OAuth et la clé developer? (J'ai trouvé quelqu'un le mentionner ici sous une question avec le titre: Google Agenda API v3 informations d'identification codées en dur; cependant, la question et la solution étaient pour PHP, et je ne sais pas si quelque chose de similaire serait possible ou nécessaire en Java).

  • J'ai vu la possibilité de créer un JWT avec un compte de service (avec Google cloud console, inscrivez-vous en tant qu'application Web, et c'est sous "certificat"), mais je n'ai pas trouvé comment je l'utiliserais conjointement avec un appel REST d'un programme Java.
  • Le lien suivant ( http://aleksz-programming.blogspot.be/2012/11/google-calendar-api.html) dit qu'il est possible d'accéder aux informations via des "applications de serveur Web" ou des "applications installées", mais ne rentre pas dans les détails. Cependant, sur la page de documentation Google OAuth 2.0, la partie "Applications de serveur Web" nécessite toujours la saisie et le consentement de l'utilisateur. Ce qui est vrai?
  • J'ai aussi trouvé cette page (https://developers.google.com/accounts/docs/OAuth2Login), mais n'a pas réussi à voir comment il pourrait être utilisé sans utiliser une page de consentement de l'utilisateur.
  • J'ai vu quelques références à un "OAuth à 2 pattes". Mais il semble que ce n'est pas un OAuth 2.0, mais une version 1 était de faire des choses. Est-ce une solution possible pour mon projet? Si oui, de quelles informations aurais-je besoin de Google Cloud Console pour le faire fonctionner?

J'espère avoir donné suffisamment d'informations sur ce que je recherche, et aussi que cette question n'a pas été couverte jusqu'à présent. J'ai fait des recherches et je n'ai pas trouvé quelque chose d'assez proche de ce que je cherchais.

Je n'ai pas pu poster plus de 2 liens (manque de réputation), mais j'ai regardé l'API REST Google Agenda v3, ainsi que la page spécifiant la création d'un JWT.

Author: Roman C, 2013-11-19

1 answers

Si vous avez juste besoin d'accéder à un ensemble particulier de calendriers, je créerais un compte de service et partagerais les calendriers nécessaires avec ce compte.

Pour ce faire:

  1. Créez un "Compte de service" dans cette console Cloud (il se trouve sous "Application Web" / "Certificat").
  2. Téléchargez la clé privée et stockez-la dans un endroit sûr.
  3. Prenez note de l'adresse e-mail associée au compte de service.
  4. Partager (via l'interface utilisateur du calendrier) tout nécessaire calendriers avec cette adresse email.
  5. Installer les bibliothèques clientes Java de l'API Google (https://developers.google.com/api-client-library/java/apis/).

Ensuite, vous devriez pouvoir utiliser le code suivant:

import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.client.json.gson.GsonFactory;
import java.io.File;
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import java.util.Arrays;
import com.google.api.services.calendar.Calendar;

GoogleCredential credentials = new GoogleCredential.Builder().setTransport(GoogleNetHttpTransport.newTrustedTransport())
  .setJsonFactory(new GsonFactory())
  .setServiceAccountId("<service account email address>@developer.gserviceaccount.com")
  .setServiceAccountScopes(Arrays.asList("https://www.googleapis.com/auth/calendar.readonly"))
  .setServiceAccountPrivateKeyFromP12File(new File("<private key for service account in P12 format>-privatekey.p12"))
.build();
Calendar client = new Calendar.Builder(GoogleNetHttpTransport.newTrustedTransport(), new GsonFactory(), credentials).build();
client.<do calendar stuff>.execute();

Si au lieu de cela vous êtes un administrateur de domaine qui doit accéder aux calendriers pour tous les comptes Google Apps qui font partie de votre domaine sans le consentement des utilisateurs individuels, alors au lieu de l'étape 4 ci-dessus:

  1. Prenez note de l'ID client associé au compte de service. Cela peut être trouvé dans le client_secrets.fichier json - généralement sous la forme 1234.apps.googleusercontent.com.
  2. Autoriser ce client à faire des demandes au nom des utilisateurs de votre organisation. Voir https://support.google.com/a/answer/162106?hl=en pour les étapes - utilisez les étendues que vous demanderez plus tard.

Vous devriez maintenant pouvoir écrire du code comme suit:

import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.client.json.gson.GsonFactory;
import java.io.File;
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import java.util.Arrays;
import com.google.api.services.calendar.Calendar;

GoogleCredential credentials = new GoogleCredential.Builder().setTransport(GoogleNetHttpTransport.newTrustedTransport())
  .setJsonFactory(new GsonFactory())
  .setServiceAccountId("<service account email address>@developer.gserviceaccount.com")
  .setServiceAccountScopes(Arrays.asList("https://www.googleapis.com/auth/calendar"))
  .setServiceAccountPrivateKeyFromP12File(new File("<private key for service account in P12 format>-privatekey.p12"))
  .setServiceAccountUser("<domain user whose data you need>@yourdomain.com")
.build();
Calendar client = new Calendar.Builder(GoogleNetHttpTransport.newTrustedTransport(), new GsonFactory(), credentials).build();
client.<do calendar stuff as that user>()
 9
Author: aeijdenberg, 2013-11-22 16:58:13