将数据写入多个Google云端存储分区

时间:2016-05-24 04:04:56

标签: cloud google-cloud-storage bucket

我正在撰写一项服务,该服务应将数据写入不同的Google云端存储帐户。账户的所有者应“注册”我的服务,我会定期将数据写入他们账户的桶中。

我想让“注册”变得尽可能简单。我仍然试图围绕谷歌的OAuth2。 我想理想地创建我自己的帐户,所有者可以向其授予存储桶权限,我可以写入他们的存储桶。我如何实现这一目标? 我想以编程方式在JAVA中编写数据

1 个答案:

答案 0 :(得分:0)

您描述的情景,即客户拥有Google云帐户,而您作为第三方希望代表客户行事,这是OAuth 2的核心功能。不幸的是,因为它涉及3个不同的方共享凭证内容,它也是使用Google Cloud进行身份验证的最复杂方式。这样做的方式是您的应用请求用户同意,用户告诉Google有关该同意,Google会为您提供代表该用户行事的凭据。由于涉及三方,因此称为三方OAuth(3LO)。

以下是此OAuth流程的概述:https://developers.google.com/identity/protocols/OAuth2WebServer#overview

以下是使用Java库构建此代码的示例:https://developers.google.com/api-client-library/java/google-api-java-client/oauth2#web_server_applications

以下是该示例中Java代码的重要部分:

public class CalendarServletSample extends AbstractAuthorizationCodeServlet {

  @Override
  protected void doGet(HttpServletRequest request, HttpServletResponse response)
      throws IOException {
    // do stuff
  }

  @Override
  protected String getRedirectUri(HttpServletRequest req) throws ServletException, IOException {
    GenericUrl url = new GenericUrl(req.getRequestURL().toString());
    url.setRawPath("/oauth2callback");
    return url.build();
  }

  @Override
  protected AuthorizationCodeFlow initializeFlow() throws IOException {
    return new GoogleAuthorizationCodeFlow.Builder(
        new NetHttpTransport(), JacksonFactory.getDefaultInstance(),
        "[[ENTER YOUR CLIENT ID]]", "[[ENTER YOUR CLIENT SECRET]]",
        Collections.singleton(CalendarScopes.CALENDAR)).setDataStoreFactory(
        DATA_STORE_FACTORY).setAccessType("offline").build();
  }

  @Override
  protected String getUserId(HttpServletRequest req) throws ServletException, IOException {
    // return user ID
  }
}

public class CalendarServletCallbackSample extends AbstractAuthorizationCodeCallbackServlet {

  @Override
  protected void onSuccess(HttpServletRequest req, HttpServletResponse resp, Credential credential)
      throws ServletException, IOException {
    resp.sendRedirect("/");
  }

  @Override
  protected void onError(
      HttpServletRequest req, HttpServletResponse resp, AuthorizationCodeResponseUrl errorResponse)
      throws ServletException, IOException {
    // handle error
  }

  @Override
  protected String getRedirectUri(HttpServletRequest req) throws ServletException, IOException {
    GenericUrl url = new GenericUrl(req.getRequestURL().toString());
    url.setRawPath("/oauth2callback");
    return url.build();
  }

  @Override
  protected AuthorizationCodeFlow initializeFlow() throws IOException {
    return new GoogleAuthorizationCodeFlow.Builder(
        new NetHttpTransport(), JacksonFactory.getDefaultInstance()
        "[[ENTER YOUR CLIENT ID]]", "[[ENTER YOUR CLIENT SECRET]]",
        Collections.singleton(CalendarScopes.CALENDAR)).setDataStoreFactory(
        DATA_STORE_FACTORY).setAccessType("offline").build();
  }

  @Override
  protected String getUserId(HttpServletRequest req) throws ServletException, IOException {
    // return user ID
  }
}

您应该注意,此代码是围绕常见的Java“Servlet”模型构建的,它还假设您正在使用某种数据存储来记住用户的刷新令牌。整个OAuth舞蹈的最终结果是你得到一个“刷新令牌”,你可以定期使用它来获得一个可以持续长达一个小时的临时“会话令牌”。您需要使用某种数据存储来记住所有这些令牌。