在使用服务帐户创建文件时是否可以阻止下载/打印/复制内容?

时间:2017-08-30 14:24:46

标签: java google-api google-drive-api google-oauth

我在创建带有服务帐户的文件时尝试使用setViewersCanCopyContent(false)setWritersCanShare(false)方法禁用下载/打印/复制内容,但是如果我在浏览器中打开该文件我没有登录Google帐户,我仍然能够执行这些功能。

编辑(添加更多信息)

以下是我的工作方式:我有这个服务帐户,而且,我有我称之为"服务帐户所有者",这是我用来创建服务的电子邮件开发者控制台中的帐户>我是。当我调用我的应用程序时,我的代码在服务帐户的驱动器中创建了一个文件夹,然后我将其移动到我的服务帐户所有者的驱动器并将其设置为所有者(使用setTransferOwnership(true)) - 我使用这种方法,因为我可以注意到,服务帐户的云端硬盘无法通过浏览器访问(仅通过API)。

然后,当我创建文件时,我致电setParents({FOLDER_ID}),其中FOLDER_ID是服务帐户所有者驱动器中文件夹的ID。然后,当我登录服务帐户所有者的驱动器并选择一个文件时,我可以看到服务帐户是文件的所有者任何有链接的人都可以查看文件< / em>,但是每个可以查看文件的人,也可以下载/打印/复制内容。

以下是我使用的代码:

HttpTransport transport = GoogleNetHttpTransport.newTrustedTransport();
JsonFactory jsonFactory = JacksonFactory.getDefaultInstance();
final Credential credential = new GoogleCredential.Builder()                        
    .setTransport(transport)
    .setJsonFactory(jsonFactory)
    .setServiceAccountId({SERVICE_ACCOUNT_ID})
  .setServiceAccountScopesArrays.asList(DriveScopes.DRIVE_METADATA_READONLY, DriveScopes.DRIVE, DriveScopes.DRIVE_FILE, DriveScopes.DRIVE_APPDATA)
    .setServiceAccountPrivateKeyFromP12File(new File("{PATH_TO_P12_FILE}")
    .build();

Drive drive = new Drive.Builder(transport, jsonFactory, credential)
    .setHttpRequestInitializer(new HttpRequestInitializer() {
         @Override
         public void initialize(HttpRequest httpRequest) throws IOException {
             credential.initialize(httpRequest);
             httpRequest.setConnectTimeout(2 * 60000);  // 2 minutes connect timeout
             httpRequest.setReadTimeout(2 * 60000);  // 2 minutes read timeout

         }
    })
    .setApplicationName("{MY_APP}")
    .build();

File fileMetadata = new File();
fileMetadata.setName("test.doc");
fileMetadata.setMimeType("application/vnd.google-apps.document");
fileMetadata.setViewersCanCopyContent(false);
fileMetadata.setWritersCanShare(false);
fileMetadata.setParents(Arrays.asList("{SERVICE_ACCOUNT_OWNER_FOLDER_ID}"));

File file = null;

try {
    FileContent mediaContent = new FileContent("application/vnd.openxmlformats-officedocument.wordprocessingml.document", new java.io.File("{PATH_TO_FILE.doc}"));
    file = this.drive.files()
        .create(fileMetadata, mediaContent)
        .setFields("id, webViewLink")
        .execute();
} catch (IOException e) {
    e.printStackTrace();
}

Permission readPermission = new Permission();
readPermission.setType("anyone");
readPermission.setRole("reader");

drive.getDrive().permissions().create(file.getId(), readPermission)
            .execute();

是否可以使用服务帐户禁用这些功能?

3 个答案:

答案 0 :(得分:1)

我不确定我完全理解这里的问题。

首先关闭服务帐户不是你。将其视为虚拟用户它只能访问您提供的帐户。我将假设您与服务帐户共享该文件夹。

现在,如果我们在您对服务帐户进行身份验证时查看代码,则使用范围对其进行身份验证,这是访问范围。

setServiceAccountScopesArrays.asList(DriveScopes.DRIVE_METADATA_READONLY, DriveScopes.DRIVE, DriveScopes.DRIVE_FILE, DriveScopes.DRIVE_APPDATA)

随着DriveScopes.Drive为您提供完全访问权限,添加所有这些功能几乎已经过时了。

因此,如果您想阻止服务帐户写入文件,那么您应该只使用DriveScopes.DRIVE_METADATA_READONLY

我不明白

  

在我的Google云端硬盘中,当我选择创建的文件时,我可以看到我是该文件的所有者,任何拥有该链接的人都可以看到它。但是每个人都可以下载/打印/复制文件的内容。

当您登录自己登录的Google云端硬盘网站时,您可以创建一个文件,服务帐户也可以查看该文件。但我不确定你的意思是什么。没有人能够在您无法访问的Google云端硬盘中看到您的个人文件。如果您与某人共享文件,则无法阻止他们下载/打印/复制该文件。这与服务帐户无关。

更新

  

然后,当我登录服务帐户所有者的驱动器并选择一个文件时,我可以看到该服务帐户是该文件的所有者,任何拥有该链接的人都可以查看文件,但是每个人都可以查看该文件,也可以下载/打印/复制内容。

不,如果您向某人提供该文件的链接,并且他们在谷歌驱动器中查看该文件,则无法阻止他们下载/打印/处理内容

答案 1 :(得分:0)

你正确地做到了这一点。 fileMetadata.setViewersCanCopyContent(false);是您应该如何阻止下载的。我想知道在转让所有权期间这是否会丢失。

如果您希望自己的文件归常规帐户(您的&#34;服务帐户所有者&#34;)所有,那么您会发现直接在该帐户下创建文件要简单得多,而不是通过首先在服务帐户下创建然后传输它的额外步骤。它将清理您的代码,并避免转移过程的任何微妙的副作用。

答案 2 :(得分:0)

我注意到如果我像这样更新文件(创建之后):

File updatedFile = new  File();
updatedFile.setViewersCanCopyContent(false);
updatedFile.setWritersCanShare(false);
drive.files().update(file.getId(), updatedFile).execute();

然后禁用下载/打印/复制。我仍然无法在文件创建时禁用它,但这种方式足以满足我的要求。