Могу ли я ограничить доступные области в учетной записи службы Google API?

#google-api #google-drive-api

#google-api #google-drive-api

Вопрос:

Я сделал следующее:

  1. Создал проект в консоли API Google
  2. Включен API Google Drive в проекте
  3. Создал учетную запись службы
  4. Общий доступ к папке Google Drive с учетной записью службы
  5. Успешно подключился к Google Диску и получил список папок и файлов, совместно используемых с учетной записью службы.

Когда вы создаете идентификатор клиента OAuth, вы можете ограничить его предопределенными областями. Насколько я могу судить, учетная запись службы имеет доступ к любой области Google Drive. Я хотел ограничить это до следующей области: https://www.googleapis.com/auth/drive.readonly просто как подтверждение того, что приложение Google Drive, которое я создаю, не может непреднамеренно добавлять / редактировать / удалять какие-либо файлы.

Я знаю, что могу добавить учетную запись к другим ролям. Однако я просмотрел список несколько раз, и ни один из них не связан с Google Диском. Я попытался создать свою собственную роль, но доступные разрешения на этом экране также не ссылаются на Google Диск. Возможно, я что-то пропустил или есть другое место, где я мог бы посмотреть. Есть предложения?

Ответ №1:

Чтобы ограничить область действия учетной записи службы, вы должны указать область на стороне сервера.

Учетные записи служб — это специальные учетные записи Google, которые могут использоваться приложениями для программного доступа к API Google через OAuth 2.0. Учетная запись службы использует поток OAuth 2.0, который не требует авторизации пользователя. Вместо этого он использует ключевой файл, доступ к которому доступно только вашему приложению.

Например:

В python вы можете указать область действия учетной записи службы, создав список областей, и использовать его в качестве параметра при получении учетных данных.

Папки и файлы:

введите описание изображения здесь

python:

Поиск по всему изображению с расширением jpeg:

 import httplib2
import os
from apiclient import discovery
from google.oauth2 import service_account


scopes = ["https://www.googleapis.com/auth/drive.readonly"]
secret_file = os.path.join(os.getcwd(), 'client_secret.json')
credentials = service_account.Credentials.from_service_account_file(secret_file, scopes=scopes)
service = discovery.build('drive', 'v3', credentials=credentials)
page_token = None
while True:
    response = service.files().list(q="mimeType='image/jpeg'",
                                          spaces='drive',
                                          fields='nextPageToken, files(id, name)',
                                          pageToken=page_token).execute()
    for file in response.get('files', []):
        # Process change
        print('Found file: %s' % (file.get('name')))
    page_token = response.get('nextPageToken', None)
    if page_token is None:
        break
 

Вывод:

 Found file: cute-puppy.jpg
 

Создание папки с областью только для чтения:

 import httplib2
import os
from apiclient import discovery
from google.oauth2 import service_account

scopes = ["https://www.googleapis.com/auth/drive.readonly"]
secret_file = os.path.join(os.getcwd(), 'client_secret.json')
credentials = service_account.Credentials.from_service_account_file(secret_file, scopes=scopes)
service = discovery.build('drive', 'v3', credentials=credentials)

file_metadata = {
    'name': 'Invoices',
    'mimeType': 'application/vnd.google-apps.folder'
}
file = service.files().create(body=file_metadata,
                                    fields='id').execute()
 

Сообщение об ошибке:

 <HttpError 403 when requesting https://www.googleapis.com/drive/v3/files?fields=idamp;alt=json returned "Insufficient Permission: Request had insufficient authentication scopes.". Details: "Insufficient Permission: Request had insufficient authentication scopes.">
 

Ссылки:

Комментарии:

1. Спасибо за ответ. Я работаю с третьей стороной, и я надеялся, что они смогут создать учетную запись службы и заблокировать ее, чтобы дать им некоторое представление. Затем я пишу серверный код. Но если это единственный способ, пусть будет так.