2016-05-24 5 views
0

Ich schreibe einen Dienst, der Daten in verschiedene Google Cloud Storage-Konten schreiben soll. Der Eigentümer der Konten muss sich bei meinem Dienst anmelden und ich werde regelmäßig Daten in den Kontobereich meines Kontos schreiben.Schreiben von Daten in mehrere Google Cloud Storage-Buckets

Ich möchte die "Anmeldung" so einfach wie möglich machen. Ich versuche immer noch, meinen Kopf um Googles OAuth2 zu wickeln. Ich möchte im Idealfall mein eigenes Konto erstellen, dem der Besitzer Buckets Erlaubnis geben kann und ich in ihren Bucket schreiben kann. Wie erreiche ich das? Ich möchte Daten programmgesteuert in JAVA schreiben

Antwort

0

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.

Verwandte Themen