Сервисный аккаунт API Google. Может видеть только служебные учетные записи диска даже с широким делегированием доступа - PullRequest
1 голос
/ 27 марта 2020

В настоящее время я использую учетную запись службы Google, для которой включено делегирование по всему домену (я перешел по этой ссылке https://developers.google.com/identity/protocols/oauth2/service-account и по этой ссылке https://developers.google.com/admin-sdk/reports/v1/guides/delegation) и имеет "https://www.googleapis.com/auth/drive область включена. Я загрузил учетные данные json для учетной записи службы и поместил их в тот же каталог, что и мой сценарий python. Проблема заключается в том, что я олицетворяю другой пользователь разрешает использовать имя пользователя User2 в моем домене, и я пытаюсь перечислить файлы на диске пользователя 2. Я получаю файлы только на диске своей учетной записи службы.

У меня есть фрагмент кода, который выполняет олицетворение пользователя 2 .

def auth():
    domain = 'domain'
    # impersonate this user
    user = 'testuser' # id only (ie. without @domain)
    #scopes = ['https://www.googleapis.com/auth/drive',]
    key_file = 'service_account.json'

    subject = ''.join([user,'@',domain])
    delegated_credentials = service_account.Credentials.from_service_account_file(key_file)
    delegated_credentials.with_subject(subject)
    drive_service = googleapiclient.discovery.build('drive', 'v2', credentials=delegated_credentials)

    return drive_service

Затем, позже, я пытаюсь получить список файлов в mydrive пользователей.

children = service.children().list(folderId='root', **param).execute()

for child in children.get('items', []):
    item = service.files().get(fileId=child['id']).execute()

Над элементом всегда есть «Начало работы PDF» в учетной записи службы. мой диск

В основном вся цель этого состоит в том, чтобы программно изменить владельца любой папки (плюс ее содержимое) на другого пользователя в том же G-Suite.

Кроме того, я не хочу поделиться папкой с моим Сервисный аккаунт, как говорят многие другие посты. Это не должно иметь место, так как я выдаю себя за владельца.

Я прошу прощения, если это не правильный способ задать вопрос. Это мой первый пост.

1 Ответ

1 голос
/ 30 марта 2020

Ответ:

В процессе аутентификации есть две проблемы: отсутствующие области действия и неправильно назначенная переменная.

Дополнительная информация:

  1. При назначении переменной delegated_credentials вы пропускаете области действия из своих делегированных учетных данных.
  2. Вы не назначаете новые делегированные учетные данные при добавлении темы.

Как вы можете видеть в документации Подготовка к авторизованному вызову API , при определении объекта credentials вы должны указать, какие области вы будете использовать в запрос.

Затем, при добавлении области к учетным данным, вам необходимо присвоить ее переменной, которую можно передать в сборку службы Drive.

Исправления кода:

Чтобы исправить пункт 1, вам нужно раскомментировать ваши области и изменить эту строку:

delegated_credentials = service_account.Credentials.from_service_account_file(key_file)

, чтобы включить области:

scopes = ['https://www.googleapis.com/auth/drive']
delegated_credentials = service_account.Credentials.from_service_account_file(
        key_file, scopes=scopes)

Также вам нужно будет назначить delegated_credentials.with_subject(subject) к себе перед сборкой сервопривода ice:

delegated_credentials = delegated_credentials.with_subject(subject)
drive_service = googleapiclient.discovery.build(
        'drive', 'v2', credentials=delegated_credentials)

Надеюсь, это полезно для вас!

Ссылки:

...