Может ли администратор Служб 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).
Зависимости проекта 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
}
}