Невозможно получить токен доступа от Google для учетной записи службы - PullRequest
0 голосов
/ 25 марта 2020

Я пытаюсь настроить приложение, способное работать с Gmail API. Как вы знаете, чтобы работать с ним, у нас должен быть токен доступа. Существует несколько способов запроса этого токена, но для моих нужд это должна быть служебная учетная запись, поскольку в будущем этот программный код будет находиться внутри Windows Service ... (поэтому нет возможности получить токен вручную перенаправление с URL Google, только веб-запрос и ответ - выход)

Итак, что я уже сделал:

  1. Создан новый проект (в Google Cloud Platform);
  2. Создана новая учетная запись службы в этом проекте (в соответствии с указанными здесь шагами: https://developers.google.com/identity/protocols/oauth2/service-account#creatinganaccount);
  3. Создан и загружен ключ * .P12;
  4. Включено делегирование всего домена [до шага 4, как было предложено во многих похожих вопросах];
  5. Авторизовал область "https://mail.google.com/" в учетной записи администратора G Suite для правильного идентификатора клиента (в соответствии с шагами, указанными здесь: https://developers.google.com/identity/protocols/oauth2/service-account#delegatingauthority);
  6. Использовал такой простой код для авторизации и запроса токена:
            const string serviceAccountEmail = "***test@oauthtester-271011.iam.gserviceaccount.com";
            const string serviceAccountCertPath = @"C:\Users\user\Documents\Visual Studio 2017\Projects\OAuthTester\OAuthTester\bin\Debug\oauthtester-271011-bd2cced31ea5.p12";
            const string serviceAccountCertPassword = "notasecret";
            const string userEmail = "***oauthtest@***.com";

            X509Certificate2 certificate = new X509Certificate2(
                serviceAccountCertPath,
                serviceAccountCertPassword,
                X509KeyStorageFlags.Exportable);

            ServiceAccountCredential credential = new ServiceAccountCredential(
                new ServiceAccountCredential.Initializer(serviceAccountEmail)
                {
                    Scopes = new[] { GoogleScope.ImapAndSmtp.Name }, //"https://mail.google.com/"
                    User = userEmail
                }.FromCertificate(certificate));


            credential.RequestAccessTokenAsync(CancellationToken.None).Wait();

К сожалению, я сталкиваюсь с ошибкой:

Client is unauthorized to retrieve access tokens using this method, or client not authorized for any of the scopes requested.

У меня также пробовал:

  1. Чтобы изменить serviceAccountEmail на ClientId;
  2. Чтобы создать, удалить и снова добавить Авторизованный доступ в G Suite для того же идентификатора клиента;
  3. Удалить и создайте другую учетную запись службы, а затем авторизуйте новый идентификатор клиента в G Suite.

К сожалению, каждый раз, когда я сталкиваюсь с одной и той же ошибкой. Может, кто-то угадает, что я делаю не так?

...