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.
Dies kann mit dem Oauth2-Spielplatz unter https://developers.google.com/oauthplayground erfolgen
Schritte:-
Credentials/Create Credentials/OAuth Client Id
dann wähle Web application
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();
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:
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:
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:
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!