#google-api #google-drive-api
#google-api #google-drive-api
Вопрос:
Я сделал следующее:
- Создал проект в консоли API Google
- Включен API Google Drive в проекте
- Создал учетную запись службы
- Общий доступ к папке Google Drive с учетной записью службы
- Успешно подключился к 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. Спасибо за ответ. Я работаю с третьей стороной, и я надеялся, что они смогут создать учетную запись службы и заблокировать ее, чтобы дать им некоторое представление. Затем я пишу серверный код. Но если это единственный способ, пусть будет так.