【问题标题】:Is AbstractAppEngineAuthorizationCodeServlet supported on Appengine Flexible Environment?App Engine 柔性环境是否支持 Abstract AppEngineAuthorizationCodeServlet?
【发布时间】:2018-03-27 19:57:04
【问题描述】:

我想知道 AppEngine 柔性环境是否支持来自 com.google.api-client 的 AbstractAppEngineAuthorizationCodeCallbackServlet。

我正在从已弃用的环境 (vm:true) 迁移到最新版本的灵活环境 (env:flex)。

当访问从 AbstractAppEngineAuthorizationCodeServlet 扩展的我的一个 servlet 时,流程可以完美运行,并且重定向到从 AbstractAppEngineAuthorizationCodeCallbackServlet 扩展的其他 servlet。现在,当它尝试运行时:

TokenResponse response = flow.newTokenRequest(code).setRedirectUri(redirectUri).execute();

(来自 AbstractAuthorizationCodeCallbackServlet 类的 doGet 内的行)

它返回一个:

com.google.apphosting.api.ApiProxy$CallNotFoundException: Can't make API call urlfetch.Fetch in a thread that is neither the original request thread nor a thread created by ThreadManager

更新

我可以在 Cloud Console 上检查我的实例确实在 Flexible 上运行。

【问题讨论】:

  • Per cloud.google.com/appengine/docs/standard/java/javadoc/com/…,它似乎是一个 App Engin estandard env API。这可能就是您收到错误的原因。其实错误信息我很熟悉,是标准env的限制:cloud.google.com/appengine/docs/standard/java/…。我认为您的代码仍在以某种方式使用 App Engine 标准 API。
  • @ChanseokOh 根据上述文件,我同意你的看法。但是有一些方法可以检查服务的当前环境是什么?因为根据迁移文档,除了新环境所需的其他更改之外,定义我使用的环境是 app.yaml 上的 env:flex 。
  • 一种方法是转到 console.cloud.google.com,选择您的项目 > App Engine > 版本。 “环境”列将为“env: flex”显示“flexible”。根据你所说,我敢打赌你是在灵活的环境中。
  • 是的。但我在检查之前的版本,所有版本都显示“灵活”。似乎参数“VM:true”实际上已经在设置柔性环境。我现在看到我只是从旧版本的灵活版本迁移到最后一个版本,而不是从标准版本迁移到灵活版本......但仍然不知道 lib 发生了什么。
  • "vm: true" 和 "env: flexible" 肯定是不同的运行时环境。 “vm: true”设计的环境在历史上被称为“托管虚拟机”,它作为有效的运行时和品牌都已失效:cloud.google.com/appengine/docs/flexible/java/upgrading托管虚拟机有点类似于灵活的环境,但它们不是一样。

标签: jsp google-app-engine authentication app-engine-flexible


【解决方案1】:

我刚刚发现 lib 使用有什么问题

在创建 GoogleAuthorizationCodeFlow 对象时,我传递了一个 GoogleClientSecrets:

Builder(HttpTransport transport, JsonFactory jsonFactory, GoogleClientSecrets clientSecrets, Collection<String> scopes)

出于某种原因,将 id 和 secret 作为字符串传递(使用 Builder 的另一个构造函数),它可以工作。

GoogleAuthorizationCodeFlow.Builder(HttpTransport, JsonFactory, String, String, Collection<String> scopes)

但不确定原因。

------------------------- 编辑 --------- --------------------------

我刚刚在这里看到,除了不使用 GoogleClientSecrets 对象之外,我还做了另一个更改。

private static final HttpTransport HTTP_TRANSPORT = new NetHttpTransport();
private static final UrlFetchTransport HTTP_TRANSPORT = new UrlFetchTransport();

使用 UrlFetchTransport 而不是 NetHttpTransport 是显示堆栈跟踪的真正原因。

【讨论】:

  • 有趣。提交了一个错误:github.com/google/google-api-java-client/issues/1105
  • @ChanseokOh,请检查我的更新。我错了。
  • 是的,URL fetch 是标准环境的东西:cloud.google.com/appengine/docs/flexible/java/… 你不应该在柔性环境中使用它。
  • 如果GoogleClientSecrets 不是原因,我建议将其从您接受的答案中删除,以便为有类似问题的其他人提供准确的信息。顺便说一句,我提交了一个错误来更新 std-to-flex 迁移文档。
猜你喜欢
  • 2018-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-23
  • 1970-01-01
相关资源
最近更新 更多