Доступ к Google Vault с использованием служебной учетной записи в C # .Net - PullRequest
0 голосов
/ 22 декабря 2018

Я успешно получаю доступ к учетным записям пользователей Gmail через нашу учетную запись службы, используя приведенный ниже код (за исключением использования областей gmail и объекта службы gmail).Тем не менее, использование того же подхода не удается для доступа к хранилищу.

/* Example of service-account-credentials.json file:
{
 "type": "service_account",
 "project_id": "[REDACTED]",
 "private_key_id": "[REDACTED]",
 "private_key": "[REDACTED]",
 "client_email": "[REDACTED].gserviceaccount.com",
 "client_id": "[REDACTED]",
 "auth_uri": "https://accounts.google.com/o/oauth2/auth",
 "token_uri": "https://oauth2.googleapis.com/token",
 "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
   "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/[REDACTED]"
 }
*/

// parsed to my ServiceAccountKey class as follows:

//check "type" == "service_account"
//ServiceAccount.Project = "project_id"
//ServiceAccount.Id = "private_key_id"
//ServiceAccount.Private = "private_key"
//ServiceAccount.Client = "client_id"
//ServiceAccount.Email = "client_email"
//ServiceAccountKey.Auth == "auth_uri"
//ServiceAccountKey.Token == "token_uri"
//ServiceAccountKey.Provider == "auth_provider_x509_cert_url"
//ServiceAccountKey.Credential == "client_x509_cert_url"

ServiceAccountKey sak = new ServiceAccountKey(@"C:\Temp\service-account-credentials.json");

ServiceAccountCredential.Initializer saci = new ServiceAccountCredential.Initializer(sak.Email, sak.Token.AbsoluteUri);

saci.User = "[REDACTED]";  // should I be specifying the user who has Vault access?
saci.Scopes = new[] { VaultService.Scope.EdiscoveryReadonly };

ServiceAccountCredential sac = new ServiceAccountCredential(saci.FromPrivateKey(sak.Private));

BaseClientService.Initializer bcsi = new BaseClientService.Initializer();

bcsi.HttpClientInitializer = sac;
bcsi.ApplicationName = sak.Project;

VaultService vs = new VaultService(bcsi);

MattersResource.ListRequest lr = vs.Matters.List();
lr.PageSize = 10;
ListMattersResponse lmr = lr.Execute();

При использовании фактического пользователя, например, с saci.User = "google-vault-admin@company.com", я получаю следующую ошибку:

Ошибка: «unauthorized_client», Описание: «Клиент не авторизован для получения маркеров доступа с использованием этого метода.», Uri: «»

Однако при использовании учетной записи службы без делегированного пользователя (или указав, что saci.User = sak.Email) я получаю сообщение об ошибке:

Пользователь не принадлежит ни одному клиенту Dasher

Если я использую подход OAuth2 для учетной записи администратора Google Vault(то есть тот, который я вхожу в Google Vault через браузер), я могу успешно получить доступ к Vault через мою программу.Тем не менее, я хотел бы использовать учетную запись службы для потока на стороне сервера.Есть мысли о том, где я ошибаюсь, или можно ли использовать учетные записи служб для доступа к Google Vault?В разделе разрешений (https://console.developers.google.com/apis/credentials?...) предполагается, что учетная запись службы действительна для доступа к API-хранилищу. Я правильно настроил области действия и учетные данные, она аналогична Gmail, которая была успешной.

Возможно,адрес электронной почты учетной записи службы требует лицензии Google Vault?

(Примечание: я пробовал аналогичный подход в Java и, что интересно, получаю 401).

...