2016-02-04 1 views
2

J'ai un serveur web jetty sécurisé SSL dont la tâche est de lire/envoyer des emails au nom de l'utilisateur. Pour lire pub/sub est préférable, au lieu de tirer. Ont suivi ces étapes de developers.google.comGmail API configurer le compte de service et lire/envoyer des mails au nom de l'utilisateur

  1. a créé un projet dans la console, activé Gmail api, compte de service créé avec Google Apps délégation de domaine à l'échelle téléchargée à la fois JSON et p12 clé privée
  2. Créé OAuth cliend-id en sélectionnant web l'application a donné un nom et qu'autorisé URI de redirection à l'un des serveurs web point final api
  3. Grant publie droit au sujet en utilisant api
  4. sujet créé la console dans le pub-sub et souscrit avec un point final HTTPs. Manuellement vérifiée à l'aide API de console pour publier un message et reçu avec succès

Maintenant, tout ce qui reste à faire est d'utiliser la bibliothèque client Java pour utiliser les informations d'identification de compte de service et de parler à gmail des API pour le compte de l'utilisateur (ont recueilli auth & jeton d'actualisation des utilisateurs pour le sujet)

Étapes essayées.

  1. En utilisant la clé privée téléchargée (p12) essayé de créer des titres de compétences et pour l'échantillon récupération des étiquettes du courrier

    HttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); 
    JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();  
    String serviceAccount = "[email protected]"; 
    Credential credential = GoogleCredential.Builder().setTransport(HTTP_TRANSPORT)  
    .setJsonFactory(JSON_FACTORY) 
    .setServiceAccountId(serviceAccount) 
    .setServiceAccountPrivateKeyFromP12File(new File("/path-to-key-file.p12")) 
    .setServiceAccountScopes(Collections.singleton(GmailScopes.GMAIL_LABELS)) 
    .build(); 
    Gmail service = new Gmail.Builder(HTTP_TRANSPORT, JSON_FACTORY, cred).setApplicationName("web-application-name-created-via-console").build(); 
    String user = "me"; //Tried direct email id also 
    service.users().labels().list(user).execute(); 
    

Réponse,

{ 
    "code" : 400, 
    "errors" : [ { 
    "domain" : "global", 
    "message" : "Bad Request", 
    "reason" : "failedPrecondition" 
    } ], 
    "message" : "Bad Request" 
} 

Note: La partie codante est essayé dans le serveur local et non celui qui a SSL. Je suppose que cela ne devrait pas être un problème car j'ai tous les fichiers clés nécessaires pour accéder à l'API.

S'il vous plaît, faites-moi savoir s'il me manque quelque chose.

+0

Avez-vous un moyen de consigner la requête finale? :) Ce serait utile. Par exemple. méthode, URL et en-têtes. – Tholle

+0

Avez-vous résolu cela? Comment envoyez-vous au nom d'un utilisateur? –

+0

Oui en utilisant GoogleCredential.getApplicationDefault() – Itachi

Répondre

0

Initialement, j'utilisais les ID de client OAuth 2.0 pour mon application Web afin d'extraire des messages d'un compte gmail spécifique. Et puis j'ai réalisé que le consentement n'était pas du tout requis pour ma demande et c'est alors que je suis tombé sur les comptes de service Google qui ont éliminé le consentement et l'enregistrement des jetons d'autorisation. J'ai essayé le même code affiché ci-dessus et frappé exactement la même réponse affichée "message" : "Bad Request", "reason" : "failedPrecondition".

Pour résoudre ce problème, ajoutez .setServiceAccountUser(googleServiceAccountUser) où googleServiceAccountUser est défini sur mon adresse e-mail google ([email protected]) à partir de laquelle mon application tentait de lire les messages. Dans votre extrait de code, l'appel ".setServiceAccountUser()" est manquant et son ajout peut vous aider à résoudre le problème.

private static Credential authorize() throws Exception { 

    GoogleCredential credential = new GoogleCredential.Builder() 
    .setTransport(httpTransport) 
    .setJsonFactory(JSON_FACTORY) 
    .setServiceAccountId(googleServiceAccountId) 
    .setServiceAccountPrivateKeyFromP12File(new File(privatekeyFile)) 
    .setServiceAccountScopes(Collections.singleton(GmailScopes.MAIL_GOOGLE_COM)) 
    .setServiceAccountUser(googleServiceAccountUser) 
    .build(); 

    return credential; 
}