Das von Ihnen beschriebene Szenario, in dem ein Kunde ein Google Cloud-Konto hat und Sie als Dritter im Auftrag des Kunden handeln möchten, ist ein zentrales Merkmal von OAuth 2. Leider Da drei verschiedene Parteien Anmeldedaten austauschen, ist dies auch die komplexeste Art, sich mit Google Cloud zu authentifizieren. Die Funktionsweise besteht darin, dass Ihre App die Zustimmung des Nutzers anfordert, der Nutzer Google über diese Einwilligung informiert und Google Ihnen Zugangsdaten gibt, um im Namen dieses Nutzers zu agieren. Da drei Parteien beteiligt sind, wird dies als 3-beiniges OAuth (3LO) bezeichnet.
Hier ist ein Überblick über diese OAuth Flow: https://developers.google.com/identity/protocols/OAuth2WebServer#overview
Und hier ist ein Beispiel dieser für den Bau der Java-Bibliothek: https://developers.google.com/api-client-library/java/google-api-java-client/oauth2#web_server_applications
Hier ist der wichtige Abschnitt von Java-Code aus diesem Beispiel:
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
}
}
Sie sollten beachten, dass dieser Code um das gängige Java- "Servlet" -Modell herum aufgebaut ist. Außerdem wird davon ausgegangen, dass Sie eine Art Datenspeicher verwenden, um sich an die Aktualisierungstoken für Ihre Benutzer zu erinnern. Das Endergebnis des gesamten OAuth-Tanzes ist, dass Sie einen "Refresh-Token" erhalten, den Sie regelmäßig verwenden können, um einen temporären "Session-Token" zu erhalten, der bis zu einer Stunde dauern kann. Sie müssen eine Art Datenspeicher verwenden, um sich an alle diese Tokens zu erinnern.