wake-up-neo.net

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

Angenommen, ich habe eine Web-App, die in einem Hintergrunddienst auf Drive-Dateien zugreifen muss. Sie besitzt entweder die Dateien, auf die zugegriffen wird, oder wird in einem Google-Konto ausgeführt, für das der Eigentümer die Dokumente freigegeben hat.

Ich verstehe, dass meine App ein Aktualisierungstoken benötigt, aber ich möchte den Code nicht schreiben, um das zu erhalten da ich es nur einmal tun werde.

Hinweis: Dies ist KEIN Dienstkonto. Die App wird unter einem herkömmlichen Google-Konto ausgeführt. Das Dienstkonto ist in einigen Situationen ein gültiger Ansatz. Die Technik der Verwendung von Oauth Playground zur Simulation der App kann jedoch eine Menge redundanten Aufwands einsparen und gilt für alle APIs, für die die Freigabe für ein Dienstkonto nicht unterstützt wird.

59
pinoyyid

Dies kann mit dem Oauth2-Spielplatz unter https://developers.google.com/oauthplayground erfolgen

Schritte:-

  1. Erstellen Sie das Google-Konto (z. B. [email protected]) - Überspringen Sie diesen Schritt, wenn Sie ein vorhandenes Konto verwenden.
  2. Verwenden Sie die API-Konsole, um die mydriveapp ( https://console.developers.google.com/apis/credentials/oauthclient?project=mydriveapp oder einfach https: //console.developers) zu registrieren .google.com/apis / )
  3. Erstellen Sie einen neuen Satz von Anmeldeinformationen. Credentials/Create Credentials/OAuth Client Id dann wähle Web application
  4. Fügen Sie https://developers.google.com/oauthplayground als gültigen Umleitungs-URI ein
  5. Notieren Sie die Client-ID (Web-App) und das Client-Geheimnis
  6. Melden Sie sich als [email protected] an
  7. Gehe zum Spielplatz Oauth2
  8. Stellen Sie unter Einstellungen (Zahnradsymbol) Ein.
    • Oauth Flow: Server
    • Zugangsart: offline
    • Verwenden Sie Ihre eigenen OAuth Anmeldeinformationen: TICK
    • Kunden-ID und Kundengeheimnis: ab Schritt 5
  9. Klicken Sie auf Schritt 1 und wählen Sie Drive API https://www.googleapis.com/auth/drive (diese Technik funktioniert jedoch auch für alle aufgelisteten Google-APIs).
  10. Klicken Sie auf APIs autorisieren. Sie werden aufgefordert, Ihr Google-Konto auszuwählen und den Zugriff zu bestätigen
  11. Klicken Sie auf Schritt 2 und "Exchange-Autorisierungscode für Token".
  12. Kopieren Sie das zurückgegebene Refresh-Token und fügen Sie es in Ihre App, Ihren Quellcode oder in einen Speicher ein, von dem Ihre App es abrufen kann.

Ihre App kann jetzt unbeaufsichtigt ausgeführt werden und das Aktualisierungstoken wie beschrieben verwenden https://developers.google.com/accounts/docs/OAuth2WebServer#offline , um ein Zugriffstoken zu erhalten.

NB. Beachten Sie, dass das Aktualisierungstoken von Google verfallen kann. Dies bedeutet, dass Sie ab Schritt 5 die Schritte wiederholen müssen, um ein neues Aktualisierungstoken zu erhalten. Das Symptom hierfür ist ein ungültiger Zuschuss, der zurückgegeben wird, wenn Sie versuchen, das Aktualisierungstoken zu verwenden.

NB2. Diese Technik funktioniert gut, wenn Sie eine Web-App möchten, die auf Ihr eigenes (und nur Ihr eigenes) Laufwerkskonto zugreift, ohne sich die Mühe zu machen, den entsprechenden Autorisierungscode zu schreiben immer nur einmal ausgeführt werden. Überspringen Sie einfach Schritt 1 und ersetzen Sie "my.drive.app" in Schritt 6 durch Ihre eigene E-Mail-Adresse. Stellen Sie sicher, dass Sie über die Sicherheitsrisiken informiert sind, wenn das Aktualisierungstoken gestohlen wird.

Siehe Woodys Kommentar unten, wo er auf dieses Google-Video verweist https://www.youtube.com/watch?v=hfWe1gPCnzc

. . .

Hier ist eine kurze JavaScript-Routine, die zeigt, wie Sie das Refresh-Token aus dem OAuth Playground verwenden, um einige Drive-Dateien aufzulisten. Sie können es einfach kopieren und in Chrome) einfügen = dev console, oder führen Sie es mit node aus. Geben Sie natürlich Ihre eigenen Anmeldeinformationen an (die folgenden sind alle gefälscht).

function get_access_token_using_saved_refresh_token() {
    // from the oauth playground
    const refresh_token = "1/0PvMAoF9GaJFqbNsLZQg-f9NXEljQclmRP4Gwfdo_0";
    // from the API console
    const client_id = "559798723558-amtjh114mvtpiqis80lkl3kdo4gfm5k.apps.googleusercontent.com";
    // from the API console
    const client_secret = "WnGC6KJ91H40mg6H9r1eF9L";
    // from https://developers.google.com/identity/protocols/OAuth2WebServer#offline
    const refresh_url = "https://www.googleapis.com/oauth2/v4/token";

    const post_body = `grant_type=refresh_token&client_id=${encodeURIComponent(client_id)}&client_secret=${encodeURIComponent(client_secret)}&refresh_token=${encodeURIComponent(refresh_token)}`;

    let refresh_request = {
        body: post_body,
        method: "POST",
        headers: new Headers({
            'Content-Type': 'application/x-www-form-urlencoded'
        })
    }

    // post to the refresh endpoint, parse the json response and use the access token to call files.list
    fetch(refresh_url, refresh_request).then( response => {
            return(response.json());
        }).then( response_json =>  {
            console.log(response_json);
            files_list(response_json.access_token);
    });
}

// a quick and dirty function to list some Drive files using the newly acquired access token
function files_list (access_token) {
    const drive_url = "https://www.googleapis.com/drive/v3/files";
    let drive_request = {
        method: "GET",
        headers: new Headers({
            Authorization: "Bearer "+access_token
        })
    }
    fetch(drive_url, drive_request).then( response => {
        return(response.json());
    }).then( list =>  {
        console.log("Found a file called "+list.files[0].name);
    });
}

get_access_token_using_saved_refresh_token();
117
pinoyyid

Lassen Sie mich eine alternative Route zu Pinoyyids hervorragender Antwort hinzufügen (was bei mir nicht funktioniert hat - das Auftauchen von Umleitungsfehlern).

Anstelle von OAuthPlayground können Sie auch direkt die HTTP REST= API verwenden. Der Unterschied zu Pinoyyids Antwort besteht also darin, dass wir die Dinge lokal erledigen. Befolgen Sie die Schritte 1-3 von Pinoyyids Antwort. Ich zitiere sie:

  1. Erstellen Sie das Google-Konto (z. B. [email protected]) - Überspringen Sie diesen Schritt, wenn Sie ein vorhandenes Konto verwenden.
  2. Verwenden Sie die API-Konsole, um die mydriveapp ( https://console.developers.google.com/apis/credentials/oauthclient?project=mydriveapp oder einfach https: //console.developers) zu registrieren .google.com/apis / )
  3. Erstellen Sie einen neuen Satz von Anmeldeinformationen (NB OAuth Client-ID nicht Dienstkontoschlüssel und wählen Sie dann "Webanwendung" aus der Auswahl)

Fügen Sie jetzt anstelle des Spielplatzes Folgendes zu Ihren Anmeldeinformationen hinzu:

Autorisierte JavaScript-Quellen: http: // localhost (Ich weiß nicht, ob dies erforderlich ist, aber mach es einfach.)
Autorisierte Redirect-URIs: http: // localhost: 808

Screenshot:

OAuth source/redirect settings

Stellen Sie sicher, dass Sie Ihre Änderungen tatsächlich über die blaue Schaltfläche unten speichern !

Jetzt möchten Sie wahrscheinlich eine GUI verwenden, um Ihre HTTP-Anforderungen zu erstellen. Ich habe Insomnia verwendet, aber Sie können Postman oder CURL verwenden. Ich empfehle Insomnia, damit Sie die Zustimmungsbildschirme leicht durchgehen können.

Erstellen Sie eine neue [~ # ~] get [~ # ~] -Anforderung mit den folgenden Parametern:

URL: https://accounts.google.com/o/oauth2/v2/auth
Query Param: redirect_uri=http://localhost:8080
Query Param: Prompt=consent
Query Param: response_type=code
Query Param: client_id=<your client id from OAuth credentials>
Query Param: scope=<your chosen scopes, e.g. https://www.googleapis.com/auth/drive.file>
Query Param: access_type=offline

Wenn Ihr bevorzugtes Tool die URL-Codierung nicht automatisch verarbeitet, stellen Sie sicher, dass Sie alles richtig machen.

Bevor Sie Ihre Anfrage abfeuern, richten Sie einen Webserver zum Abhören von http://localhost:8080 Ein. Wenn Sie Node und Npm installiert haben und npm i express Ausführen, erstellen Sie ein index.js:

var express = require('express');
var app = express();

app.get('/', function (req, res) {
  res.send('ok');
  console.log(req)
});

app.listen(8080, function () {
  console.log('Listening on port 8080!');
});

Und starte den Server mit node index.js. Ich empfehle, entweder nicht das gesamte req -Objekt zu protokollieren oder node index.js | less Für die vollständige Ausgabe auszuführen, da dies sehr umfangreich ist.
Auch für andere Sprachen gibt es sehr einfache Lösungen. Z.B. Verwenden Sie den in PHP integrierten Webserver auf 8080 php -S localhost:8080.

Feuern Sie jetzt Ihre Anfrage ab (in Insomnia) und Sie sollten aufgefordert werden, sich anzumelden:

login Prompt

Melden Sie sich mit Ihrer E-Mail-Adresse und Ihrem Passwort an und bestätigen Sie den Einwilligungsbildschirm (sollte die von Ihnen gewählten Bereiche enthalten).

Gehen Sie zurück zu Ihrem Terminal und überprüfen Sie die Ausgabe. Wenn Sie das Ganze protokolliert haben, scrollen Sie nach unten (z. B. in weniger), bis Sie eine Zeile mit code=4/... Sehen.

Kopieren Sie diesen Code; Es ist Ihr Autorisierungscode, den Sie gegen einen Zugriffs- und Aktualisierungstoken eintauschen möchten. Kopieren Sie nicht zu viel - wenn ein kaufmännisches Und & Vorhanden ist, kopieren Sie es nicht oder nichts danach. & Begrenzt die Abfrageparameter. Wir wollen nur das code.

Richten Sie nun eine HTTP POST Anfrage mit Verweis auf https://www.googleapis.com/oauth2/v4/token Als URL verschlüsselt ein. In Insomnia können Sie einfach darauf klicken - in anderen Tools müssen Sie den Header möglicherweise selbst auf Content-Type: application/x-www-form-urlencoded Setzen.

Fügen Sie die folgenden Parameter hinzu:

code=<the authorization code from the last step>
client_id=<your client ID again>
client_secret=<your client secret from the OAuth credentials>
redirect_uri=http://localhost:8080
grant_type=authorization_code

Stellen Sie erneut sicher, dass die Codierung korrekt ist.

Feuern Sie Ihre Anfrage ab und überprüfen Sie die Ausgabe von Ihrem Server. In der Antwort sollte ein JSON-Objekt angezeigt werden:

{
  "access_token": "xxxx",
  "expires_in": 3600,
  "refresh_token": "1/xxxx",
  "scope": "https://www.googleapis.com/auth/drive.file",
  "token_type": "Bearer"
}

Sie können den access_token Sofort verwenden, er ist jedoch nur eine Stunde gültig. Notieren Sie sich das Aktualisierungstoken. Diesen können Sie jederzeit * gegen einen neuen Zugriffstoken eintauschen.

* Sie müssen den Vorgang wiederholen, wenn der Benutzer sein Passwort ändert, den Zugriff widerruft, für 6 Monate inaktiv ist usw.

Happy OAuthing!

2
m02ph3u5