Может ли администратор Служб Google управлять файлами пользователей с помощью Drive SDK?

Новый Drive SDK очень хорошо для аутентифицированного пользователя. Возможно ли использовать Drive SDK используя административный доступ к Службам Google для олицетворения других пользователей домена?

API doclist может сделать это, но с этим инструментом невозможно управлять и копировать файлы (pdf, jpg).

Я использую Java с этим кодом:

credential_origine = new GoogleCredential.Builder().setTransport(HTTP_TRANSPORT)
                    .setJsonFactory(JSON_FACTORY)
                    .setServiceAccountId("[email from console api]")
                    .setServiceAccountScopes(DriveScopes.DRIVE)
                    .setServiceAccountUser("user@domain.com")
                    .setServiceAccountPrivateKeyFromP12File(new File("key.p12")).build();

Но я получаю сообщение об ошибке при попытке получить данные для user@domain.com. Если я прокомментирую .setServiceAccountUser("user@domain.com") код отлично работает для той же учетной записи, которую я использовал для создания ключа.

В старом DOCList API мы выдавали себя за другого пользователя по URL запросов. Это что-то похожее?

3 ответа

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

После того как вы создали ключ учетной записи службы в своем проекте API (из консоли API), вам нужно будет добавить этот проект в список авторизованного стороннего приложения в cPanel. Более подробную информацию об этом можно найти здесь. "Идентификатор клиента", который вам нужно использовать, связан с ключом учетной записи службы и выглядит следующим образом: <APP_ID>-<OTHER_KEY>.apps.googleusercontent.com

Поскольку вы хотите управлять файлом других пользователей, вам нужно будет авторизовать всю область диска: https://www.googleapis.com/auth/drive,

Большинство наших клиентских библиотек занимаются абстрагированием генерации заявок для разработчиков. Если бы вы могли указать, какой язык вы планируете использовать, я могу обновить этот ответ, предоставив фрагмент кода, который поможет вам начать работу.

Обновить:

код:

com.google.api.client.googleapis.auth.oauth2.GoogleCredential.Builder credential_origine_builder = new GoogleCredential.Builder().setTransport(HTTP_TRANSPORT)
                    .setJsonFactory(JSON_FACTORY)
                    .setServiceAccountId("[[]]")
                    .setServiceAccountScopes(DriveScopes.DRIVE)
                    .setServiceAccountPrivateKeyFromP12File(new File("cfg/file.p12"));

credential_origine_builder.setServiceAccountUser("user@domain.com");

работает отлично.

Если мы изменим .setServiceAccountScopes(DriveScopes.DRIVE) в

.setServiceAccountScopes(DriveScopes.DRIVE,Oauth2Scopes.USERINFO_EMAIL,Oauth2Scopes.USERINFO_PROFILE)

для получения имени и идентификатора пользователя, кажется, не совместим с .setServiceAccountUser("user@domain.com");

Использование 3-х областей отлично работает только с пользователем "владельцем" клавиш... продолжать сборку

Хорошо, вот полный код в Dartlang, чтобы перечислить олицетворенные пользовательские файлы пользователя USER@YOUR_DOMAIN с ключом JSON

Для его запуска вам потребуется сгенерировать ключ JSON (вместо P12) через Google Developer Console(в контексте проекта: Apis & auth -> credentials).генерировать ключ JSON

Зависимости проекта Dart в pubspec.yaml: googleapis googleapis_auth async)

import 'package:googleapis/drive/v2.dart';
import 'package:googleapis_auth/auth_io.dart';
import 'package:async/async.dart';

final _credentials = new ServiceAccountCredentials.fromJson(r'''
{
  "private_key_id": "*PRIVATE_KEY_ID*",
  "private_key": "*PRIVATE_KEY_CONTENT*",
  "client_email": "*SOMETHING@developer.gserviceaccount.com*",
  "client_id": "*SOMETHING.apps.googleusercontent.co*m",
  "type": "service_account"
}
''', impersonatedUser: "*USER@YOUR_DOMAIN*");  //here you type user

const _SCOPES = const [DriveApi.DriveScope];

main() async {
  var http_client = await clientViaServiceAccount(_credentials, _SCOPES);
  var drive = new DriveApi(http_client);
  var docs = await drive.files.list(maxResults: 10);

  for (var itm in docs.items) {
    print(itm.title); //list docs titles
  }
}
Другие вопросы по тегам