Java 使用服务帐户创建文件时,是否可以阻止下载/打印/复制内容?
在使用服务帐户创建文件时,我尝试使用方法Java 使用服务帐户创建文件时,是否可以阻止下载/打印/复制内容?,java,google-api,google-drive-api,google-oauth,Java,Google Api,Google Drive Api,Google Oauth,在使用服务帐户创建文件时,我尝试使用方法setViewersCanCopyContent(false)和setWritersCanShare(false)禁用下载/打印/复制内容,但如果我在未登录谷歌帐户的浏览器中打开文件,我仍然能够执行这些功能 编辑(添加更多信息) 以下是我的工作方式:我有这个服务帐户,还有我所谓的“服务帐户所有者”,即我用来在开发者控制台>IAM中创建服务帐户的电子邮件。当我调用我的应用程序时,我的代码在服务帐户的驱动器中创建了一个文件夹,然后我将其移动到服务帐户所有者的驱
setViewersCanCopyContent(false)
和setWritersCanShare(false)
禁用下载/打印/复制内容,但如果我在未登录谷歌帐户的浏览器中打开文件,我仍然能够执行这些功能
编辑(添加更多信息)
以下是我的工作方式:我有这个服务帐户,还有我所谓的“服务帐户所有者”,即我用来在开发者控制台>IAM中创建服务帐户的电子邮件。当我调用我的应用程序时,我的代码在服务帐户的驱动器中创建了一个文件夹,然后我将其移动到服务帐户所有者的驱动器并将其设置为所有者(使用setTransferOwnery(true)
)-我使用这种方法,因为正如我所注意到的,服务帐户的驱动器无法通过浏览器访问(仅通过API)
然后,当我创建一个文件时,我调用setParents({FOLDER\u ID})
其中FOLDER\u 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)
将所有这些添加到DriveScope中几乎是杀鸡取卵。无论如何,Drive都会给你完全的访问权限
因此,如果要防止服务帐户写入文件,则应仅使用DriveScopes.DRIVE\u METADATA\u READONLY
我不明白的是
在我的谷歌硬盘中,当我选择创建的文件时,我可以看到我是文件的所有者,任何有链接的人都可以看到它。但每个人都可以下载/打印/复制文件内容
当您以自己的身份登录到Google drive网站时,您可以创建一个文件,服务帐户将能够看到它。但我不确定你对其他人的意思。没有人可以在Google drive中看到您未授予访问权限的个人文件。如果您与某人共享文件,则无法阻止他们下载/打印/复制该文件。这与服务帐户无关
更新:
然后,当我登录服务帐户所有者的驱动器并选择一个文件时,我可以看到该服务帐户是该文件的所有者,任何具有链接的人都可以查看该文件,但可以查看该文件的每个人也可以下载/打印/复制内容
否如果你给某人一个指向该文件的链接,而他们在谷歌硬盘上查看该文件,那么就没有办法阻止他们下载/打印/处理该内容你这样做是正确的<代码>文件元数据。setViewersCanCopyContent(false)是您应该如何防止下载的。我想知道这是不是在转让过程中丢失了
如果您希望您的文件由一个普通帐户(您的“服务帐户所有者”)拥有,那么您会发现直接在该帐户下创建文件要简单得多,而不是先在服务帐户下创建文件,然后再传输文件。它将清理您的代码,还可以避免传输过程中任何细微的副作用。我注意到,如果我像这样更新文件(创建后):
然后它禁用下载/打印/复制。我仍然无法在创建文件时禁用它,但这种方式足以满足我的要求。谢谢您的帮助。我将在代码中替换驱动器作用域。我对我的问题进行了编辑,以便让你明白发生了什么。当您说“如果您与某人共享一个文件,则无法阻止他们下载/打印/复制该文件”时,您的意思是当我创建一个文件并使用角色“reader”创建权限并键入“anyone”时,调用setViewersCanCopyContent(false)不会产生任何效果?请检查更新。解决服务帐户中缺少web视图的聪明方法。我看过你的更新,但我不同意“没有办法阻止他们下载/打印/处理内容”。如果我在共享对话>高级>中通过Google Drive创建一个文件,则会有一个选项“禁用供评论者和观众下载、打印和复制的选项”。如果我检查并用另一个Google帐户打开此文件,我将无法下载/打印/复制。我的问题是如何通过代码(API)来实现这一点。据我所知,这并不是我仅仅用了五年的时间。如果你不相信我,我可以尝试ping团队中的某个人进行验证。这可能是硬盘内置的功能,有很多只支持谷歌的功能。等待我的联系人做出响应,如果我们添加了功能请求,情况会更糟。我以前找过这个功能。最好的情况是它隐藏在文档中我们都没有发现的某个地方。我只转移文件夹的所有权,而不是文件的所有权,这意味着所有文件都属于我的服务帐户。我无法在“服务帐户所有者”下创建文件,因为我没有使用G套件,也无法模拟用户电子邮件。您可以使用存储的刷新令牌在服务帐户所有者上创建文件。看,是的,但这种方法超出了我的范围。其中一个要求是使用服务帐户创建文件。
File updatedFile = new File();
updatedFile.setViewersCanCopyContent(false);
updatedFile.setWritersCanShare(false);
drive.files().update(file.getId(), updatedFile).execute();