Я пытаюсь настроить приложение, способное работать с Gmail API. Как вы знаете, чтобы работать с ним, у нас должен быть токен доступа. Существует несколько способов запроса этого токена, но для моих нужд это должна быть служебная учетная запись, поскольку в будущем этот программный код будет находиться внутри Windows Service ... (поэтому нет возможности получить токен вручную перенаправление с URL Google, только веб-запрос и ответ - выход)
Итак, что я уже сделал:
- Создан новый проект (в Google Cloud Platform);
- Создана новая учетная запись службы в этом проекте (в соответствии с указанными здесь шагами: https://developers.google.com/identity/protocols/oauth2/service-account#creatinganaccount);
- Создан и загружен ключ * .P12;
- Включено делегирование всего домена [до шага 4, как было предложено во многих похожих вопросах];
- Авторизовал область "https://mail.google.com/" в учетной записи администратора G Suite для правильного идентификатора клиента (в соответствии с шагами, указанными здесь: https://developers.google.com/identity/protocols/oauth2/service-account#delegatingauthority);
- Использовал такой простой код для авторизации и запроса токена:
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.
У меня также пробовал:
- Чтобы изменить serviceAccountEmail на ClientId;
- Чтобы создать, удалить и снова добавить Авторизованный доступ в G Suite для того же идентификатора клиента;
- Удалить и создайте другую учетную запись службы, а затем авторизуйте новый идентификатор клиента в G Suite.
К сожалению, каждый раз, когда я сталкиваюсь с одной и той же ошибкой. Может, кто-то угадает, что я делаю не так?