Аккаунт службы Gmail API

Я хочу читать свой почтовый ящик Gmail с помощью API Gmail. Мне нужно использовать учетную запись службы, поскольку мое приложение не взаимодействует с пользователем. По запросу я получаю следующую ошибку:

"InnerException = {"Error:\"unauthorized_client\", Description:\"Unauthorized client or scope in request.\", Uri:\"\""} "

Это мой код:

        string applicationName = "Gmail API .NET";
        string[] scopes = { GmailService.Scope.GmailReadonly };

        string certPath = "./XXXXXXXXXX.p12";
        string userEmail = "[email protected]";
        string serviceAccountEmail = "MYSERVICEACCOUNT...am.gserviceaccount.com";

        //Carga el certificado obtenido de 
        var certificate = new X509Certificate2(certPath, "notasecret", X509KeyStorageFlags.Exportable);

        ServiceAccountCredential credential = new ServiceAccountCredential(
            new ServiceAccountCredential.Initializer(serviceAccountEmail)
            {
                User = userEmail,
                Scopes = scopes
            }.FromCertificate(certificate)
        );

        if (credential.RequestAccessTokenAsync(CancellationToken.None).Result) <--- Here I get the error
        {
            GmailService gs = new GmailService(
                new BaseClientService.Initializer()
                {
                    ApplicationName = applicationName,
                    HttpClientInitializer = credential
                }
            );
        }

Что я делаю неправильно? Кто-нибудь может мне помочь?

С Уважением


person ratillo89    schedule 15.09.2016    source источник
comment
Вам необходимо настроить свою учетную запись Gmail, чтобы разрешить доступ по протоколам POP3 / SMTP. Вы можете сделать это в настройках Gmail в Интернете.   -  person Shannon Holsinger    schedule 15.09.2016
comment
Спасибо. У меня получилось, но результат тот же :(   -  person ratillo89    schedule 15.09.2016
comment
Попробуй это. ebstalimited.zendesk. com / hc / en-us / article / Вам также понадобится G Suite для использования сервисных аккаунтов.   -  person Radim Göth    schedule 02.04.2020


Ответы (4)


Попробуйте проверить эту документацию об учетной записи службы. в библиотеках .NET. Эта документация также предоставляет вам образец кода, которому вы можете следовать, чтобы настроить учетную запись службы. Эта ссылка также может дать вам представление о как получить доступ к GMAIL API с помощью учетной записи службы.

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

person KENdi    schedule 16.09.2016

Вы можете использовать учетную запись службы для отправки писем только для учетной записи GSuite, но не для учетной записи Gmail.

Если у вас есть учетная запись Gmail, вы можете использовать трехстороннюю аутентификацию OAuth2 или включить 2FA, создайте пароль приложения и используйте его, как показано здесь

Если вы ИСПОЛЬЗУЕТЕ учетную запись GSuite, вы можете использовать ServiceAccount, но вам необходимо убедиться, что она имеет делегирование домена G Suite, как описано здесь, а затем вам нужно предоставить доступ к домену GSuite, как описано здесь

person ender    schedule 30.08.2018

Вы пробовали пример кода от Google для этой функции?

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

 // ...

 public class MyClass {

   // ...

 /// <summary>
 /// Retrieve a Message by ID.
 /// </summary>
 /// <param name="service">Gmail API service instance.</param>
 /// <param name="userId">User's email address. The special value "me"
 /// can be used to indicate the authenticated user.</param>
 /// <param name="messageId">ID of Message to retrieve.</param>
 public static Message GetMessage(GmailService service, String userId, String messageId)
 {
     try
     {
         return service.Users.Messages.Get(userId, messageId).Execute();
     }
     catch (Exception e)
     {
         Console.WriteLine("An error occurred: " + e.Message);
     }

     return null;
 }

 // ...

}

Вы пробовали использовать проводник API здесь: https://developers.google.com/gmail/api/v1/reference/users/messages/get#net и ввели информацию о вашем запросе? Это работало со страницы API?

person Shannon Holsinger    schedule 15.09.2016
comment
Из гугл теста работает нормально. Думаю, проблема в аутентификации. Я получаю эту ошибку {Ошибка: \ unauthorized_client \, Описание: \ Неавторизованный клиент или область в запросе. \, Uri: \\}, когда вызываю этот метод credential.RequestAccessTokenAsync (CancellationToken.None). Результат - person ratillo89; 15.09.2016

Учетные записи служб не могут получить доступ к почтовым ящикам @ gmail.com. Вы должны использовать один из других поддерживаемых сценариев авторизации OAuth 2.0, описанных на странице https://developers.google.com/identity/protocols/OAuth2.

Подробнее см. https://stackoverflow.com/a/39534420/3377170.

person Brandon Jewett-Hall    schedule 17.09.2016
comment
Мне удалось поработать со старой учетной записью Gmail. Тесты проводились с новой учетной записью. Возможно ли, что если старые учетные записи позволят вам использовать учетные записи служб? - person ratillo89; 19.09.2016
comment
В прошлом существовала лазейка, которая позволяла учетным записям служб получать доступ к учетным записям @ gmail.com, но она была закрыта. См. stackoverflow.com/a/39534420/3377170. - person Brandon Jewett-Hall; 20.09.2016