webentwicklung-frage-antwort-db.com.de

Mit OAuth2 programmgesteuert bei Google authentifizieren

Wie kann ich mich programmgesteuert bei Google authentifizieren? Nachdem ClientLogin ( https://developers.google.com/accounts/docs/AuthForInstalledApps ) veraltet ist, wie können wir mit OAuth2 eine programmgesteuerte Authentifizierung bei Google durchführen?

Mit ClientLogin können wir einen Post an https://www.google.com/accounts/ClientLogin mit E-Mail- und Passwortparametern ausführen und das Authentifizierungstoken erhalten.

Mit OAuth2 kann ich keine Lösung finden!

Meine App ist ein Java Hintergrundprozess. Ich habe unter folgendem Link gesehen: developers.google.com/accounts/docs/OAuth2InstalledApp#refresh, wie man mit einem aktualisierten Token ein neues Zugriffstoken erhält.

Das Problem ist, dass ich kein Java) Beispiel zum Instanziieren eines Analytics-Objekts (zum Beispiel) zum Ausführen einer Abfrage finden kann, wenn ich ein neues gültiges Zugriffstoken habe

Dies ist mein Code, der beim Aufrufen von "execute ()" einen 401 Invalid-Berechtigungsnachweis zurückgibt:

public class Test {

static final String client_id = "MY_CLIENT_ID";
static final String client_secret = "MY_SECRET";
static final String appName = "MY_APP";

private static final HttpTransport HTTP_TRANSPORT = new NetHttpTransport();
private static final JsonFactory JSON_FACTORY = new JacksonFactory();

static String access_token = "xxxx";
static String refreshToken = "yyyyy";

public static void main (String args[]){

    try {

        GoogleCredential credential = 
            new GoogleCredential.Builder()
                .setTransport(HTTP_TRANSPORT)
                .setJsonFactory(JSON_FACTORY)
                .setClientSecrets(client_id, client_secret).build();
        credential.setAccessToken(access_token);
        credential.setRefreshToken(refreshToken);
        //GoogleCredential
        Analytics analytics = Analytics.builder(HTTP_TRANSPORT, JSON_FACTORY)
            .setApplicationName(appName)
            .setHttpRequestInitializer(credential)
            .build();

        Accounts accounts = analytics.management().accounts().list().execute();
    } catch (Exception e) {
        e.printStackTrace();
    } 
}

Worin besteht das Problem?

26
Andrea Zonzin

Überprüfen Sie den Fluss OAuth 2 für die installierte Anwendung:

https://developers.google.com/accounts/docs/OAuth2InstalledApp

Der Benutzer muss sich weiterhin beim ersten Mal bei einem Browser authentifizieren. Anschließend können Sie das Aktualisierungstoken speichern und für nachfolgende Anforderungen verwenden.

Überprüfen Sie für alternative Lösungen den Gerätefluss oder die Dienstkonten. Sie werden in derselben Dokumentation erläutert.

16

Ich fand den Google Java Client zu komplex und schlecht dokumentiert. Hier ist ein einfaches Servlet Beispiel mit Google Oauth2. Für einen Hintergrundprozess müssen Sie eine Anfrage stellen access_type = offline Wie bereits erwähnt, muss der Benutzer eine einmalige Autorisierung durchführen. Danach können Sie Aktualisierungs-Token anfordern, da Google-Token in einer Stunde verfallen.

15
Andrew

Obwohl ich zu schätzen weiß, dass das OP ursprünglich auf den Ansatz OAuth2InstalledApp abzielte, möchte ich mit dem Ansatz OAuth2WebServer auf eine funktionierende Lösung hinweisen. Sie unterscheiden sich nicht wesentlich und das hat bei mir funktioniert. Ich habe festgestellt, dass die google OAuth Bibliothek ziemlich gut ist, da sie die meisten OAuth Tanzaufgaben für Sie erledigt und das Auffrischen des Zugriffstokens erleichtert Die folgende Lösung hängt von der Verwendung eines vorab erhaltenen Aktualisierungstokens ab.

Wie in der akzeptierten Antwort angegeben, funktioniert die Authentifizierung mit OAuth=) (auch für einen Java) -Hintergrundprozess), bei dem die Anforderung auf den Zugriff auf Benutzerdaten angewiesen ist

erfordert, dass sich der Benutzer zum ersten Mal bei einem Browser authentifiziert. Anschließend können Sie das Aktualisierungstoken speichern und für nachfolgende Anforderungen verwenden.

Aus früheren Kommentaren des OP geht Folgendes hervor

Also bin ich OAuth2 für Webserver-Anwendungen gefolgt (hier ist der Offline-Zugriff dokumentiert), aber ich habe immer noch Probleme.
1) Ich führe die erste Anfrage über einen Browser durch und erhalte einen Authentifizierungscode für den Offline-Zugriff
2) Ich führe ein Java) Posting des Authentifizierungscodes durch und erhalte Zugriffstoken und Refresh-Token

Der Ansatz, den ich gewählt habe, ist eher so

1) Ich führe die erste Anforderung über einen Browser durch und erhalte das Aktualisierungstoken für den Offline-Zugriff
2) In Java) stelle ich der Bibliothek das Aktualisierungstoken zur Verfügung und die Bibliothek erhält das Zugriffstoken usw

insbesondere mit der google-api-Java-client-Bibliothek ist der Code recht unkompliziert. Beachten Sie, dass ich kein Zugriffstoken wie im OP festgelegt habe, da ich credential.refreshToken(); aufrufe. anderswo. (Ich überprüfe, ob ich bereits ein gültiges Zugriffstoken habe und rufe vor dem API-Aufruf die Aktualisierung auf.)

  private Credential generateCredentialWithUserApprovedToken() throws IOException,
      GeneralSecurityException {
    JsonFactory jsonFactory = JacksonFactory.getDefaultInstance();
    HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();
    InputStreamReader inputStreamReader =
        new InputStreamReader(jsonFileResourceForClient.getInputStream());
    GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(jsonFactory, inputStreamReader);
    return new GoogleCredential.Builder().setTransport(httpTransport).setJsonFactory(jsonFactory)
        .setClientSecrets(clientSecrets).build().setRefreshToken(REFRESH_TOKEN);
  }

Beachten Sie, dass dies Schritt 2 meines Ansatzes abdeckt und das REFRESH_TOKEN, die in Schritt 1 erwähnt wurden, können wie nachstehend erläutert erhalten werden.

Zunächst muss eine Web-App eingerichtet werden, um eine OAuth 2.0-Client-ID auf der Google-Konsole für Anmeldeinformationen zu erstellen, auf der Sie landen mit einer heruntergeladenen JSON-Datei, die in das Objekt GoogleClientSecrets eingelesen wird.

d.h.

enter image description here

Stellen Sie sicher, dass Sie die Google-Spielplatz-Rückruf-URL zu den autorisierten Umleitungs-URIs hinzufügen

enter image description here

Dann haben Sie Ihre Kunden-ID und das Kundengeheimnis für den Spielplatz bereit und können auch den json herunterladen, den Sie in Ihren Java Code ziehen können.

enter image description here

Das REFRESH_TOKEN erhalten Sie, indem Sie eine Anfrage an google oauth playground mit der folgenden Konfiguration senden. Beachten Sie, dass Sie vor Schritt 1 und der Auswahl Ihres Bereichs zu den Einstellungen gehen sollten Stellen Sie sicher, dass Sie Ihre eigenen Anmeldeinformationen angeben, und fügen Sie Ihre Client-ID und Ihr Geheimnis direkt darunter hinzu

enter image description here

Beachten Sie, dass der Zugriffstyp Offline ist, was this entspricht.

Es gibt auch eine nette Erklärung, wie Sie das Aktualisierungstoken hier abrufen können https://www.youtube.com/watch?v=hfWe1gPCnzc

Das ist genug, um loszulegen und ist ein einmaliges Setup!

In Bezug auf Aktualisierungstoken sollten Sie sich über deren Lebenszyklus im Klaren sein, wie in den Dokumenten hier

Im oauthplayground sehen Sie dieses

enter image description here

aber zu Punkt 4 der Dokumentation hier heißt es so

enter image description here

Hmmm.

Siehe auch Wie autorisiere ich eine App (im Internet oder installiert) ohne Benutzereingriff? (Kanonisch?)

10
Matt C

Für Anwendungen, die sich für sich selbst authentifizieren (d. H. Für eine andere Anwendung, die sich normalerweise mit einem gemeinsam genutzten Kennwort bei einem Rollenkonto anmeldet), ist die von Google angebotene OAuth2-Alternative zu ClientLogin Dienstkonten:

https://developers.google.com/accounts/docs/OAuth2ServiceAccount

0
breno