2015-03-12 1 views
2

Я пытаюсь читать сообщения GMail, используя их API из приложения .NET. Следовательно, я использую «Service Account» (те, которые не требуют от пользователя интерактивного подтверждения доступа и предназначены для использования в режиме обслуживания для обслуживания).Невозможно использовать GMail Api из учетной записи службы из-за недействительного гранта

Итак, у меня есть следующий код ...

using System.Security.Cryptography.X509Certificates; 
using Google.Apis.Auth.OAuth2; 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Data; 
using System.IO; 

using Google.Apis.Gmail.v1; 
using Google.Apis.Gmail.v1.Data; 

namespace Test 
{ 
    public class MyClient 
    { 
    public List<Message> GetMyMessages() 
    { 
     var serviceAccountId = "MyServiceAccountId.apps.googleusercontent.com"; 
     var serviceEMailAddress = "[email protected]"; // Not required? 
     var certificatePwd = "thesecret"; 
     var userEMailAccount = "[email protected]"; 

     var certFile = File.ReadAllBytes("MyCert.p12"); 

     var cert = new X509Certificate2(certFile, certificatePwd, X509KeyStorageFlags.Exportable | X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.MachineKeySet); 
     var scopes = new string[] { GmailService.Scope.MailGoogleCom }; // Also tried with: GmailService.Scope.GmailCompose and GmailService.Scope.GmailModify 

     var currentCredential = new ServiceAccountCredential(
      new ServiceAccountCredential.Initializer(serviceAccountId) 
     { 
      User = userEMailAccount, 
      Scopes = scopes 
     }.FromCertificate(cert)); 

     var service = new GmailService(new Google.Apis.Services.BaseClientService.Initializer 
     { 
      ApplicationName = "MyApp", 
      HttpClientInitializer = currentCredential 
     }); 

     var Messages = new List<Message>(); 
     var request = service.Users.Messages.List(userEMailAccount); 
     request.MaxResults = 3; 
     // request.Q = ""; 

     do 
     { 
      try 
      { 
       var response = request.Execute(); 
       Messages.AddRange(response.Messages); 
       request.PageToken = response.NextPageToken; 
      } 
      catch (Exception e) 
      { 
       // throws exception with message: Error:"invalid_grant", Description:"", Uri:"" 
       Console.WriteLine("An error occurred: " + e.Message); 
      } 
     } while (!string.IsNullOrEmpty(request.PageToken)); 

     return Messages; 
    } 
    } 
} 

Это работает отлично до вызова метода request.Execute(), который терпит неудачу со следующим исключением: Error: "invalid_grant", Описание:» ", Uri:" "

Итак, что мне не хватает? что с этим не так?

+1

Думаю, вам стоит прочитать присягу. У учетной записи службы нет учетной записи gmail. Пользователь - это просто текстовая строка, используемая для создания аутентификации, вы можете добавить туда blah и сделать то же самое. При этом вы не можете использовать Gmail с учетной записью службы. Попробуйте Oauth2. – DaImTo

+0

Должен вас начать: http://www.daimto.com/how-to-access-gmail-with-c-net/ https://github.com/LindaLawton/Google-Dotnet-Samples/tree/master/ Google-Gmail – DaImTo

+0

Ничего себе, если у кого-то есть решение этой проблемы, это именно то место, где я застрял. – bordeo

ответ

0

Official documentation говорит, что:

Your client application signs the request for an access token using a private key downloaded from the Google Developers Console . After creating a new client ID, you should choose a “Service Account” application type and then you can download the private key. Take a look at our service account sample using Google Plus API .

Так ошибка, которую вы получили, как я вижу, может быть вызвано неправильным ключом в приложении. Может быть, вы не обновили его или что-то в этом роде.

Не забудьте изменить действие «Сборка» на Content и «Копировать в выходной каталог» на Copy if newer для ключа, который вы загрузили с сайта Google API.

+0

Привет [VMAtm], я проанализировал пример и обнаружил, что (для конструктора ServiceAccountCredential.Initializer) он передает адрес электронной почты службы, а не идентификатор учетной записи службы. Таким образом, я попытался с этим, но он вызывает другое исключение: Ошибка: «unauthorized_client», Описание: «Неавторизованный клиент или область в запросе», Uri: «" –

 Смежные вопросы

  • Нет связанных вопросов^_^