我正在撰写一项服务,该服务应将数据写入不同的Google云端存储帐户。账户的所有者应“注册”我的服务,我会定期将数据写入他们账户的桶中。
我想让“注册”变得尽可能简单。我仍然试图围绕谷歌的OAuth2。 我想理想地创建我自己的帐户,所有者可以向其授予存储桶权限,我可以写入他们的存储桶。我如何实现这一目标? 我想以编程方式在JAVA中编写数据
答案 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舞蹈的最终结果是你得到一个“刷新令牌”,你可以定期使用它来获得一个可以持续长达一个小时的临时“会话令牌”。您需要使用某种数据存储来记住所有这些令牌。