2014-01-20 39 views
39

上使用AppIdentityService的我目前使用com.google.appendinge.api.appidentity.AppIdentityService便于认证&授权使用相同的应用程序的[即一个应用程序。相同的帐户]电子表格数据通过SpreadsheetService API。在部署到GAE环境的生产模式下非常有效。但是,由于显而易见的原因,它在我的开发appengine环境中运行并不起作用(认证错误,并不奇怪)。配置开发服务器

我的问题是:是否有可能&“支持”一个人的本地开发服务器配置为使用所需的关键&证书信息,使AppIdentityService按预期工作?

我读的文章https://sites.google.com/site/oauthgoog/authenticate-google-app-engine-app我理解它表明,它是可能的,但我被错误地理解关键点&将不胜感激对此的任何反馈Pro & CON。

在一个完美的世界中,我希望我的测试环境尽可能地模仿生产模式。我也在考虑在我的测试环境中使用'normal'oauth2 web应用程序认证,但如果可能的话,宁愿坚持使用AppIdentityService。

我怀疑appengine-api-stubs.jar中的com.google.appengine.api.appidentity.dev.LocalAppIdentityService类是预期的技术,但有其他人也使用它来在开发服务器中提供AppIdentityService验证吗?我最初的假设是将com.google.appengine.spi.FactoryProvider中的类com.google.appengine.api.appidentity.IAppIdentityServiceFactoryProvider替换为使用我自己的工厂类,使用上面的LocalAppIdentityService类。还是我吠叫错了树?

使用适用于Java的GAE SDK 1.8.8。

+2

我不认为使用AppIdentity有很多意义:AppIdentity的信任锚是Prod中的App Engine。在开发环境中,无论如何您都需要新的信任锚(即服务帐户)。你可能编写一个新的AppIdentityService,但为什么要麻烦? Dev中无论如何都需要一个新用户,因此需要不同的代码。 我使用生成DriveService和SpreadsheetService的工厂,使用AppIdentity(在Prod中)或服务帐户(在Dev中)。 AppIdentity和服务帐户在Drive中获得不同的权限,服务帐户只能访问测试数据。 –

回答

1

当本地开发服务器中运行时,GAE的Java应用的身份API调用GoogleCredentials library to retrieve the default application credential

  1. 环境变量GOOGLE_APPLICATION_CREDENTIALS检查。如果指定了这个变量,它应该指向一个 定义凭证的文件。得到这个 用途凭证的最简单方法是使用Google Developers Console在部分的API &验证创建一个服务帐户,在次节凭据。创建一个服务帐户 或选择一个现有帐户并选择生成新的JSON密钥。将 环境变量设置为下载的JSON文件的路径。
  2. 如果您已在您的计算机上安装了Google Cloud SDK并运行了命令gcloud auth login,那么您的身份可用作 代理来测试来自该计算机的代码调用API。
  3. 如果您在Google App Engine生产中运行,则将使用与应用程序关联的内置服务帐户。
  4. 如果你在谷歌Compute Engine的生产运行,内置与虚拟机实例 相关的服务帐户将被使用。
  5. 如果这些条件都不成立,则会发生错误。

它看起来像选项#2可能是最简单的你(运行gcloud auth login有你的代码中使用您的谷歌帐户进行验证时,在本地运行),但你也可以做#1。

1

我一直在使用GAE的PHP开发服务器,并且与AppIdentity服务工作不正常相同。在PHP中,您可以通过将$_SERVER['APPLICATION_ID']设置为dev~yourapplicationid来解决此问题。我确信必须有一种方法可以在Java中执行相同的操作,您只需将dev~添加到应用程序标识的开头即可与开发环境一起使用。