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



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

编辑(添加了更多信息)

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

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

这是我正在使用的代码:

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();

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

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

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

现在,如果在您对服务帐户进行身份验证时,请查看您的代码。

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

添加所有这些几乎是杀死的,因为驱动器可以使您完全访问。

因此,如果要防止服务帐户写入文件,则应仅使用DriveScopes.DRIVE_METADATA_READONLY

我不明白的

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

当您自己登录到Google Drive网站时,您可以创建一个文件,并且服务帐户将能够查看它。但是我不确定您的意思是其他所有人。没有人可以在您尚未访问的Google Drive中看到您的个人文件。如果您与某人共享文件,则无法防止他们下载/打印/复制它。这与服务帐户无关。

更新

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

否,如果您给某人一个指向文件的链接,并且他们在其Google驱动器中查看它,则无法阻止他们下载/打印/应对内容

您以正确的方式进行操作。fileMetadata.setViewersCanCopyContent(false);是您应该能够防止下载的方法。我想知道在转移权期间是否以某种方式丢失了。

如果您希望您的文件由常规帐户(您的"服务帐户所有者")拥有,那么您会发现只能在该帐户下直接创建文件,而不是浏览第一个帐户的额外步骤在服务帐户下创建它,然后转移它。它将清理您的代码,并避免转移过程的任何微妙的副作用。

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

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

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

最新更新