【问题标题】:Google Drive permission list rest call does not return all permissionsGoogle云端硬盘权限列表休息调用不返回所有权限
【发布时间】: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


【解决方案1】:

我找到了问题的根源。尝试后发现,如果我手动将文件ID和权限ID输入到java权限获取方法中,它确实找到了权限。

显然另一个'fileId'值被传递在'myAwesomeMethod'比较驱动器文件夹的创建和驱动器文件夹的更新时。在这种特殊情况下,我在其余调用中检查的文件夹的父文件夹具有完全相同的共享权限,但域共享除外,因此这些数据令人困惑。

我能给出的唯一提示是始终使用简单的 Get() 对权限本身进行检查。这对我有用,因为它为我指明了正确的方向。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-22
    • 2016-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-02
    相关资源
    最近更新 更多