【发布时间】:2015-09-09 10:27:42
【问题描述】:
我目前遇到一个似乎无法解决的问题。也许有人可以澄清我做错了什么或更好地了解正在发生的事情。
我在 Google 云端硬盘中有一个文件/文件夹,它 (1) 在域级别共享,仅包含链接,以及 (2) 与某些特定用户共享。在我目前用 Java 编写的应用程序中,我想获得当前在此文件/文件夹上设置的所有权限。
显然,我的第一个入口点是测试权限列表调用:Google Developers。 已授予以下权限以测试其余调用:
- 开车
- drive.appdata
- drive.apps.readonly
- drive.file
- drive.readonly
我的调用结果包含授予用户和域(类型)的权限。以下是回复:
200 OK
- SHOW HEADERS -
{
"kind": "drive#permissionList",
"etag": "\"xxxxxxxxxx\"",
"selfLink": "https://www.googleapis.com/drive/v2/files/xxxxxxxxxx/permissions",
"items": [
{
"kind": "drive#permission",
"etag": "\"xxxxxxxxxx\"",
"id": "xxxxxxxxxx",
"selfLink": "xxxxxxxxxx",
"name": "Owner Name",
"emailAddress": "owner@random-domain.com",
"domain": "random-domain.com",
"role": "owner",
"type": "user"
},
{
"kind": "drive#permission",
"etag": "\"xxxxxxxxxx\"",
"id": "xxxxxxxxxx",
"selfLink": "xxxxxxxxxx",
"name": "User Name",
"emailAddress": "user@random-domain.com",
"domain": "random-domain.com",
"role": "writer",
"type": "user",
"photoLink": "xxxxxxxxxx"
},
{
"kind": "drive#permission",
"etag": "\"xxxxxxxxxx\"",
"id": "xxxxxxxxxx",
"selfLink": "xxxxxxxxxx",
"name": "Domain Name",
"domain": "random-domain.com",
"role": "reader",
"type": "domain",
"withLink": true
}
]
}
到目前为止一切顺利。在上面的响应中,您可以观察到已返回以下权限:所有者、用户、带有链接的域共享。所以现在我正在尝试在我的项目中做同样的事情。
public static void myAwesomeMethod(String fileId) {
Drive service = DriveDirectoryServiceManager.getDriveService("owner@random-domain.com");
PermissionList permissions = service.permissions().list(fileId).execute();
List<Permission> permissionList = permissions.getItems();
...
}
对于想了解 DriveDirectoryServiceManager 背后发生了什么的人。这里是:
public class DriveDirectoryServiceManager {
/** Email of the Service Account */
private static final String SERVICE_ACCOUNT_EMAIL = "xxxxxxxxxx";
private static final String APPLICATION_NAME = "xxxxxxxxxx";
/** Path to the Service Account's Private Key file */
private static final String PKCS = "/xxxxxxxxxx";
/**
* Build and returns a Directory service object authorized with the service
* accounts that act on behalf of the given user.
*
* @return Directory service object that is ready to make requests.
*/
public static Drive getDriveService(String user)
throws GeneralSecurityException, IOException, URISyntaxException {
HttpTransport httpTransport = new NetHttpTransport();
JacksonFactory jsonFactory = new JacksonFactory();
List<String> scope = new ArrayList<>();
scope.add(DriveScopes.DRIVE);
scope.add(DriveScopes.DRIVE_FILE);
scope.add(DriveScopes.DRIVE_APPDATA);
scope.add(DriveScopes.DRIVE_APPS_READONLY);
scope.add(DriveScopes.DRIVE_READONLY);
InputStream keyStream = DriveDirectoryServiceManager.class.getResourceAsStream(PKCS);
PrivateKey key = SecurityUtils.loadPrivateKeyFromKeyStore(
SecurityUtils.getPkcs12KeyStore(), keyStream, "notasecret", "privatekey", "notasecret");
GoogleCredential credential = new GoogleCredential.Builder()
.setTransport(httpTransport)
.setJsonFactory(jsonFactory)
.setServiceAccountId(SERVICE_ACCOUNT_EMAIL)
.setServiceAccountScopes(scope)
.setServiceAccountUser(user)
.setServiceAccountPrivateKey(key)
.build();
return new Drive.Builder(httpTransport, jsonFactory, null).setHttpRequestInitializer(credential).setApplicationName(APPLICATION_NAME).build();
}
}
人们会期望权限列表现在包含 3 个权限,但事实并非如此。似乎只返回了 2 个权限。在域级别授予的权限不在结果列表中。这是我在调试器中检查时的输出。
permissionList = {ArrayList@6468} size = 2
0 = {Permission@6472} size = 9
0 = {DataMap$Entry@6481} "domain" -> "random-domain.com"
1 = {DataMap$Entry@6482} "emailAddress" -> "owner@random-domain.com"
2 = {DataMap$Entry@6483} "etag" -> ""xxxxxxxxxx""
3 = {DataMap$Entry@6484} "id" -> "xxxxxxxxxx"
4 = {DataMap$Entry@6485} "kind" -> "drive#permission"
5 = {DataMap$Entry@6486} "name" -> "Owner Name"
6 = {DataMap$Entry@6487} "role" -> "owner"
7 = {DataMap$Entry@6488} "selfLink" -> "xxxxxxxxxx"
8 = {DataMap$Entry@6489} "type" -> "user"
1 = {Permission@6473} size = 10
0 = {DataMap$Entry@6556} "domain" -> "random-domain.com"
1 = {DataMap$Entry@6557} "emailAddress" -> "user@random-domain.com"
2 = {DataMap$Entry@6558} "etag" -> ""xxxxxxxxxx""
3 = {DataMap$Entry@6559} "id" -> "xxxxxxxxxx"
4 = {DataMap$Entry@6560} "kind" -> "drive#permission"
5 = {DataMap$Entry@6561} "name" -> "User Name"
6 = {DataMap$Entry@6562} "photoLink" -> "xxxxxxxxxx"
7 = {DataMap$Entry@6563} "role" -> "writer"
8 = {DataMap$Entry@6564} "selfLink" -> "xxxxxxxxxx"
9 = {DataMap$Entry@6565} "type" -> "user"
到目前为止,我还没有找到结果列表不同的真正原因。
【问题讨论】:
-
使用java,是否可以调用permissions.get来尝试获取丢失的权限?
-
感谢您的意见。我找到了问题的根源。尝试后发现,如果我手动将文件 ID 和权限 ID 输入到 java 权限获取方法中,它确实找到了权限。在比较驱动器文件夹的创建和驱动器文件夹的更新时,显然在“myAwesomeMethod”中传递了另一个“fileId”值。在这种特殊情况下,我在其余调用中检查的文件夹的父文件夹具有完全相同的共享权限,但域共享除外,因此这些数据令人困惑。
-
您应该将其放入答案中并接受它。这样下一个看起来相似的人就不需要弄清楚你已经做了什么。
标签: java google-app-engine google-drive-api