Управление пользователями с помощью Google-OAuth 2.0
Управление пользователями домена GSuite должно быть разделено на две части
- Admin SDK методы, такие как создание пользователей, поиск пользователей, обновление пользователей и т. д. c. (в основном все, что администратор может выполнять из административной консоли ), доступно администратору домена напрямую при аутентификации с его учетными данными
- Методы, которые включают использование большинства других 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)