7

Drive SDK的对于经过身份验证的用户来说非常好。是否可以Drive SDK使用 Google Apps 管理权限来模拟其他域用户?

doclist API 可以做到,但无法使用此工具管理和复制文件(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 模拟了另一个用户。是不是类似的东西?

4

3 回答 3

5

您可以使用服务帐户并在构建断言声明时指定要模拟的用户来执行此操作。

在 API 项目中创建服务帐户密钥后(从API 控制台),您必须将此项目添加到 cPanel 中的授权第三方应用程序列表中。可以在此处找到有关此的更多信息。您需要使用的“客户 ID”是绑定到服务帐户密钥的,看起来像<APP_ID>-<OTHER_KEY>.apps.googleusercontent.com

由于您要管理其他用户文件,因此您必须授权 Drive 范围广泛:https://www.googleapis.com/auth/drive.

我们的大多数客户端库都负责为开发人员抽象声明生成。如果您可以指定您计划使用的语言,我可以通过提供代码片段来帮助您入门来更新此答案。

于 2012-07-24T20:52:27.557 回答
0

升级:

编码:

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)

用于检索用户的名称和 ID 似乎不兼容 .setServiceAccountUser("user@domain.com");

使用 3 个作用域仅适用于密钥的用户“所有者”...继续构建

于 2012-07-27T07:53:10.613 回答
0

好的,这里是Dartlang中的完整代码,用于列出带有 JSON 键的模拟 USER@YOUR_DOMAIN 用户文件

要运行它,您需要通过Google Developer Console生成 JSON 密钥(而不是 P12) (在项目的上下文中: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
  }
}
于 2015-07-04T15:49:33.760 回答