API Googledrive: Управление доступом к общему диску

#java #google-drive-api #google-workspace #service-accounts #google-api-java-client

Вопрос:

  1. Я смог создать общий диск под своим профилем.
  2. Я создал Service Account (E.g: test@svc.company.net)
  3. Я создал G-Suite Account (E.g: test@integration-24524514.iam.gserviceaccount.com) из Service Account (E.g: test@svc.company.net)
  4. Для созданного shareddrive я назначил доступ ниже для каждого профиля
  • Мой профиль (Менеджер)
  • Учетная запись службы (например: test@svc.company.net) (Менеджер)
  • Учетная запись G-Suite (например: test@integration-24524514.iam.gserviceaccount.com) (Менеджер)
  1. Я создал подпапку под общим диском
  2. Я попытался предоставить доступ вручную из обозревателя API (https://developers.google.com/drive/api/v3/reference/permissions/create) с приведенными ниже подробностями

Параметры запроса fileId = Ix6yw5La5iTg-n*********

Тело запроса { «роль»: «читатель», «тип»: «пользователь», «Адрес электронной почты»: «test@email.com» }

  • Это прекрасно работает, когда я предоставляю доступ в качестве Своего профиля (Менеджера) и учетной записи службы (например: test@svc.company.net) (Менеджер)
  1. Когда я пытаюсь сделать то же самое через API, что и учетная запись G-Suite (например: test@integration-24524514.iam.gserviceaccount.com) (Менеджер), он возвращает ошибку ниже
 com.google.api.client.googleapis.json.GoogleJsonResponseException: 404 Not Found
{
  "code" : 404,
  "errors" : [ {
    "domain" : "global",
    "location" : "fileId",
    "locationType" : "parameter",
    "message" : "File not found: Ix6yw5La5iTg-n*********",
    "reason" : "notFound"
  } ],
  "message" : "File not found: Ix6yw5La5iTg-n*********"
}
 

Ответ №1:

Учетная запись службы не имеет прямого доступа ни к чему, не рассматривайте test@integration-24524514.iam.gserviceaccount.com ее как учетную запись пользователя, это не так.

Для учетной записи службы для доступа к файлам в Google workspace необходимо настроить олицетворение.

Подумайте о том, чтобы выдать себя за певца, готовящегося стать Майклом Джексоном на концерте. Певцу было предоставлено разрешение притворяться или выдавать себя за Майкла Джексона. Им позволено преформироваться как ему.

Чтобы учетная запись службы могла получить доступ к файлу, принадлежащему ей, у test@email.com нее должно быть разрешение выдавать test@email.com себя за другого пользователя, к которому у нее нет доступа.

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

 GoogleCredential credential = GoogleCredential.fromStream(new FileInputStream("MyProject-1234.json"))
.createScoped(Collections.singleton(SQLAdminScopes.SQLSERVICE_ADMIN))
.createDelegated("test@email.com");