Возникли проблемы с использованием create_delegated в oAuth Google Api Flow .... gDrive - PullRequest
0 голосов
/ 27 мая 2020

Суть проблемы в том, что при запуске нижеуказанного я не могу делегировать учетные данные для работы в другой учетной записи пользователя. Единственные онлайн-примеры используют учетную запись службы JSON, а НЕ поток аутентификации oAuth.

newcreds = creds.create_delegated('__testusersearch__@gdev.bc.edu')
AttributeError: 'Credentials' object has no attribute 'create_delegated'

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

#!/usr/bin/env python
from __future__ import print_function
import pickle
import os.path
import json
from googleapiclient.discovery import build
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request

import sys

print('test')
##VARS
SCOPES = ['https://www.googleapis.com/auth/drive','https://www.googleapis.com/auth/admin.directory.user']
creds = None
count = 0
##Google Creds
creds = None
if os.path.exists(os.path.dirname(os.path.abspath(__file__))+'/secrets/token.pickle'):
    with open(os.path.dirname(os.path.abspath(__file__))+'/secrets/token.pickle', 'rb') as token:
        creds = pickle.load(token)
# If there are no (valid) credentials available, let the user log in.
if not creds or not creds.valid:
    if creds and creds.expired and creds.refresh_token:
        creds.refresh(Request())
    else:
        flow = InstalledAppFlow.from_client_secrets_file(
            os.path.dirname(os.path.abspath(__file__))+'/secrets/credentials.json', SCOPES)
        creds = flow.run_local_server(port=0)
    # Save the credentials for the next run
    with open(os.path.dirname(os.path.abspath(__file__))+'/secrets/token.pickle', 'wb') as token:
        pickle.dump(creds, token)

newcreds = creds.create_delegated('__testusersearch__@address.domain')

service = build('drive', 'v3', credentials=creds)

1 Ответ

1 голос
/ 28 мая 2020

Управление пользователями с помощью Google-OAuth 2.0

Управление пользователями домена GSuite должно быть разделено на две части

  1. Admin SDK методы, такие как создание пользователей, поиск пользователей, обновление пользователей и т. д. c. (в основном все, что администратор может выполнять из административной консоли ), доступно администратору домена напрямую при аутентификации с его учетными данными
  2. Методы, которые включают использование большинства других API (Drive API, Gmail API et c.), А доступ к личным данным пользователя не является тем, к чему администратор GSuite имеет прямой доступ.

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

  • При создании (или обновлении) учетной записи службы администратор может решить, какие объемы ей присудить, и - выполнить делегирование всего домена .
  • Домен -широкое делегирование означает, что учетной записи службы разрешено представлять пользователя домена, выдавая его - то есть действовать как пользователь и получать почти такой же доступ к данным пользователей, как и сам пользователь.
  • Процесс аутентификации для работы со служебными аккаунтами отличается от обычной аутентификации Google API.
  • Нет токена доступа или обновления sh, созданного таким же образом, и файл token.json не сохраняется в рабочем каталоге администратора.
  • Вместо этого при создании учетной записи службы в Консоль GCP, учетные данные учетной записи службы необходимо загрузить в виде файла json или p12 в рабочий каталог.
  • Для использования олицетворенной учетной записи службы с файлом учетных данных json в Python определите :
from google.oauth2 import service_account

SCOPES = ['https://www.googleapis.com/auth/drive']
SERVICE_ACCOUNT_FILE = '/path/to/service.json'

credentials = service_account.Credentials.from_service_account_file(
        SERVICE_ACCOUNT_FILE, scopes=SCOPES)
delegated_credentials = credentials.with_subject('user@example.org')
drive_service = googleapiclient.discovery.build(
        'drive', 'v3', credentials=delegated_credentials)

with_subject является важной частью для того, чтобы служба выдавала себя за пользователя.

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

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

    creds = None
    # The file token.pickle stores the user's access and refresh tokens, and is
    # created automatically when the authorization flow completes for the first
    # time.
    if os.path.exists('token.pickle'):
        with open('token.pickle', 'rb') as token:
            creds = pickle.load(token)
    # If there are no (valid) credentials available, let the user log in.
    if not creds or not creds.valid:
        if creds and creds.expired and creds.refresh_token:
            creds.refresh(Request())
        else:
            flow = InstalledAppFlow.from_client_secrets_file(
                'credentials.json', SCOPES)
            creds = flow.run_local_server(port=0)
        # Save the credentials for the next run
        with open('token.pickle', 'wb') as token:
            pickle.dump(creds, token)

    service = build('drive', 'v3', credentials=creds)

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

Если вы предпочитаете использовать файл учетных данных p12 вместо json, with_subject будет заменен на create_delegated.

Пример:

from googleapiclient.discovery import build
from oauth2client.service_account import ServiceAccountCredentials

# Email of the Service Account
SERVICE_ACCOUNT_EMAIL = 'YOUR SERVICE ACCOUNT EMAIL'

# Path to the Service Account's Private Key file
SERVICE_ACCOUNT_PKCS12_FILE_PATH = '/path/to/<public_key_fingerprint>-privatekey.p12'

def create_directory_service(user_email):
    """Build and returns an Admin SDK Directory service object authorized with the service accounts
    that act on behalf of the given user.

    Args:
      user_email: The email of the user. Needs permissions to access the Admin APIs.
    Returns:
      Admin SDK directory service object.
    """

    credentials = ServiceAccountCredentials.from_p12_keyfile(
        SERVICE_ACCOUNT_EMAIL,
        SERVICE_ACCOUNT_PKCS12_FILE_PATH,
        'notasecret',
        scopes=['https://www.googleapis.com/auth/drive'])

    credentials = credentials.create_delegated(user_email)

    return build('drive', 'v3', credentials=credentials)
...