Blog
Wie man sich bei Google Drive in Java authentifiziert

Die meisten Beispiele für den Zugriff auf Google Drive von Java aus, die die Google Client SDKs verwenden, authentifizieren sich mit der veralteten GoogleCredential-Klasse und einer Schlüsseldatei für das Dienstkonto. Wir raten von der Verwendung der privaten Schlüsseldatei des Servicekontos ab, da diese Dateien einen privaten Schlüssel im Klartext enthalten, dessen Ablaufdatum auf den 1. Januar des Jahres 10000 festgelegt ist. Verwenden Sie stattdessen die kurzlebigen Anmeldeinformationen, die vom Google Cloud SDK, der App Engine, der Cloud Shell, der Compute Engine, der Cloud Run oder der GKE Workload-Identität bereitgestellt werden.
Wie man sich bei Google in Java authentifiziert
Um sich bei Google Drive oder einer anderen Google Cloud Platform API in Java zu authentifizieren, verwenden Sie die Methode getApplicationDefault wie unten gezeigt:
public class List {
public static void main(String[] args) throws IOException, GeneralSecurityException {
GoogleCredentials credentials = GoogleCredentials
.getApplicationDefault() // get ADC
.createScoped(
ImmutableSet.of(
"https://www.googleapis.com/auth/drive")); // add scope(s)
Drive service = new Drive
.Builder(
GoogleNetHttpTransport.newTrustedTransport(),
GsonFactory.getDefaultInstance(),
new HttpCredentialsAdapter(credentials)) // wrap credentials
.setApplicationName("list")
.build();
}
In den Zeilen 3-6 sehen Sie, dass wir die Standardanmeldeinformationen der Anwendung (ADC) mit dem Drive-Bereich anfordern. In Zeile 13 sehen Sie, dass wir diese Anmeldeinformationen an den Drive Builder übergeben, der im HttpCredentialsAdapter verpackt ist, damit sie mit der Drive REST API verwendet werden können.
Die Methode getApplicationDefault stellt sicher, dass Ihre Anwendung sowohl mit als auch ohne eine Schlüssel-Datei für das Dienstkonto funktioniert. Sie sucht nach Anmeldeinformationen in der folgenden Reihenfolge:
- Dienstkonto-Schlüsseldatei, auf die $GOOGLE_APPLICATION_CREDENTIALS verweist
- Standard-Anmeldeinformationen für Google Cloud SDK-Anwendungen
- Google App Engine integrierte Anmeldeinformationen
- Google Cloud Shell integrierte Anmeldeinformationen
- Google Compute Engine integrierte Anmeldeinformationen
Dieser Code funktioniert jetzt also auf Ihrem lokalen Rechner, in Google App Engine, in Google Cloud Shell, auf einer Compute-Instanz, in einem Cloud Run-Dienst und einem GKE-Pod.
Lokal ausgeführt
Bevor Sie diesen Code von Ihrem lokalen Rechner aus ausführen können, geben Sie die folgenden Befehle ein:
gcloud auth application-default login
--scopes https://www.googleapis.com/auth/drive
gcloud auth application-default set-quota-project $GOOGLE_CLOUD_PROJECT
Das ist alles, ohne eine private Schlüsseldatei!
Ausführung in einem lokalen Container
Um Ihre Anwendung in einem Container auf Ihrem lokalen Rechner auszuführen, mounten Sie das gcloud-Konfigurationsverzeichnis wie unten gezeigt:
docker run --volume $HOME/.config/gcloud:/root/.config/gcloud $IMAGE_NAME
Beachten Sie, dass das Verzeichnis .config in das Home-Verzeichnis des Benutzers eingehängt werden sollte, der den Befehl entrypoint ausführt.
Die Anwendung kann nun auch auf einer virtuellen Maschine ausgeführt werden. Das werden wir im nächsten Abschnitt zeigen.
Ausführung auf einer virtuellen Maschine
Wenn Sie diesen Code auf einer virtuellen Maschine ausführen möchten, erstellen Sie ein Dienstkonto, verknüpfen es mit der Maschine und legen die zulässigen Bereiche fest. Dies wird im folgenden Terraform-Schnipsel gezeigt:
resource "google_compute_instance" "gdrive-accessor" {
name = "gdrive-accessor"
service_account {
email = google_service_account.gdrive-accessor.email // run-as service account
scopes = [
"https://www.googleapis.com/auth/drive", // extend allowed scope
"https://www.googleapis.com/auth/cloud-platform"
]
}
...
}
resource "google_service_account" "gdrive-accessor" {
account_id = "gdrive-accessor"
display_name = "Access to the Google Drive"
}
resource "google_project_iam_member" "gdrive-accessor" {
for_each = toset(["roles/logging.logWriter", "roles/monitoring.metricWriter"])
member = google_service_account.gdrive-accessor.member
role = each.value
}
In Zeile 5 wird das Dienstkonto an die virtuelle Maschine gebunden. In Zeile 6-9 werden die Geltungsbereiche hinzugefügt. Es ist auch möglich, Terraform-Code zu schreiben, um dem erstellten Dienstkonto Zugriff auf den gewünschten Google Drive-Ordner zu gewähren. Das werde ich mir für einen anderen Blog aufheben.
Anmeldeinformationen für andere Google APIs verwenden
Sie können die Anmeldeinformationen auch in jeder anderen Google-API verwenden. Das folgende Beispiel zeigt, wie die Anmeldeinformationen für die Verbindung zu Google BigQuery verwendet werden:
BigQuery bigquery = BigQueryOptions
.newBuilder()
.setCredentials(credentials) // use credentials
.setProjectId(project)
.build()
.getService();
Fazit
Wenn Sie von Java aus auf Google Drive zugreifen, empfehlen wir Ihnen die Methode getApplicationDefault, da Sie damit eine sichere und einfache Möglichkeit haben, sich mit jeder Google-API zu verbinden, ohne eine Schlüssel-Datei für das Dienstkonto zu verwenden.
Ein funktionierendes Beispiel finden Sie auf github.
Verfasst von

Mark van Holsteijn
Mark van Holsteijn is a senior software systems architect at Xebia Cloud-native solutions. He is passionate about removing waste in the software delivery process and keeping things clear and simple.
Unsere Ideen
Weitere Blogs
Contact



