GAE后端/任务队列 - 如何在参数中传递用户凭据?

时间:2013-01-20 22:31:11

标签: java google-app-engine serialization google-drive-api google-api-java-client

在我们的GAE应用程序中,我们在谷歌驱动器中处理用户的文档,因为这个过程有时超过30秒,我们得到截止日期异常,因为它是GAE前端实例。

我们想使用后端实例。问题是如何传递凭据(com.google.api.client.auth.oauth2.Credentials)以初始化Google驱动器API。

如何将用户凭据传递到GAE任务队列,然后传递给后端实例,以便以后在任务运行时能够使用它们?

com.google.api.client.auth.oauth2.Credentials is not serializable ...

有什么办法吗?

2 个答案:

答案 0 :(得分:2)

您需要保留凭据的输入,以便您可以在后端处理程序中重新创建它。

这是授权代码,或者是为了交换授权代码而获得的访问令牌和刷新令牌。它们都是字符串所以应该很容易序列化。

如果所有这些听起来都不熟悉,我很想知道你是如何获得Credential的。以下链接到有用的文档:

值得注意的是,最后一个链接中的示例代码具体包含了一个您希望实现的方法来释放访问/刷新令牌:

/**
 * Retrieved stored credentials for the provided user ID.
 *
 * @param userId User's ID.
 * @return Stored Credential if found, {@code null} otherwise.
 */
static Credential getStoredCredentials(String userId) {
  // TODO: Implement this method to work with your database. Instantiate a new
  // Credential instance with stored accessToken and refreshToken.
  throw new UnsupportedOperationException();
}

答案 1 :(得分:0)

我建议使用AppEngineCredentialStore来存储访问权限并刷新令牌。请查看calendar-appengine-sample作为示例用法。以下是Utils.java的示例代码段:

  static GoogleAuthorizationCodeFlow newFlow() throws IOException {
    return new GoogleAuthorizationCodeFlow.Builder(
        HTTP_TRANSPORT,
        JSON_FACTORY,
        getClientCredential(),
        Collections.singleton(CalendarScopes.CALENDAR))
        .setCredentialStore(new AppEngineCredentialStore())
        .setAccessType("offline")
        .build();
  }

注意:我是google-api-java-client项目的所有者。