如何模拟在G-Suite域中运行的AppEngine Java应用程序的用户?

时间:2018-03-17 19:57:27

标签: java google-app-engine authorization

我的标准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(域范围委派)对其进行了配置。还有其他配置吗?

1 个答案:

答案 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访问云存储中的文件。但我相信这太麻烦了。我也提供了这个选项,因为我已经提到了它。