我的标准AppEngine应用程序需要在Google Sheet文档(以及其他文档)中执行更改。
为实现这一目标,我需要获取服务帐户的凭据,并以某种方式配置它应该代表用户行事。
此方法允许我提供默认服务帐户凭据:
private static GoogleCredential getDefaultServiceAccountCredential() throws IOException {
return GoogleCredential.getApplicationDefault()
.createScoped(MY_SCOPES);
}
但它不代表用户工作。
以下代码类似,使用其他(非默认)服务帐户,但仍然没有假冒:
private static GoogleCredential getNonDefaultServiceAccountCredential() throws IOException {
return GoogleCredential.fromStream(IncomingMailHandlerServlet.class.getResourceAsStream("/tokens/anoher-e6351a8c5b91.json"))
.createScoped(MY_SCOPES);
}
对于假冒,Google Docs(以及许多SO建议)提到如何使用PKCS12文件来执行此操作;但是,该文件只能在已安装的应用程序中读取为PrivateKey
,而不能在AppEngine上读取。
有没有办法获得在AppEngine中运行的Java应用程序的模拟凭据?
或者,有没有从AppEngine上的File
读取的技巧?
请注意,对于我尝试过的所有服务帐户,我使用角色所有者和DwD(域范围委派)对其进行了配置。还有其他配置吗?
答案 0 :(得分:4)
GoogleCredential reference提供了一个样本
还使用服务帐户流来模拟您拥有的域中的用户。这与上面的服务帐户流程非常相似,但您还要调用GoogleCredential.Builder.setServiceAccountUser(String)
public static GoogleCredential createCredentialForServiceAccountImpersonateUser(
HttpTransport transport,
JsonFactory jsonFactory,
String serviceAccountId,
Collection<String> serviceAccountScopes,
File p12File,
String serviceAccountUser) throws GeneralSecurityException, IOException {
return new GoogleCredential.Builder().setTransport(transport)
.setJsonFactory(jsonFactory)
.setServiceAccountId(serviceAccountId)
.setServiceAccountScopes(serviceAccountScopes)
.setServiceAccountPrivateKeyFromP12File(p12File)
.setServiceAccountUser(serviceAccountUser)
.build();
}
如何从App Engine Standard访问文件有多种选择。下面,您有两个选项说明:
<小时/> 选项1:p12File
(凭证文件)是App Engine Standard resource file。检查this answer以查看如何以代码方式访问此类文件。我强烈推荐这种方法,因为
这些文件仅以只读方式提供给您的代码,而不适用于流量服务。
File f = new File("path/below/my/project/directory/credentials.json");
并且appengine-web.xml
应该定义资源文件:
<resource-files>
<include path="path/below/my/project/directory/credentials.json"/>
</resource-files>
<小时/> 选项2:凭证文件位于云存储中。此document说明了如何从App Engine Standard访问云存储中的文件。但我相信这太麻烦了。我也提供了这个选项,因为我已经提到了它。