Andreas Bruns

Softwareentwicklung für Oldenburg und Bremen

Zugriff auf HiDrive-Cloud von Strato mit Java

Strato stellt mit dem Produkt HiDrive einen Cloud-Speicher zur Verfügung, der sich sehr gut als externer Speicher für Laptops oder Handys verwenden lässt. Die Integration in das eigene System erfolgt dank zahlreicher Protokolle (wie SFTP, SCP, WebDAV, GIT, SMB, rSync) problemlos und eine entsprechende App steht auch für Handys bereit.

Für einen Kunden sollten Dateien aus einer selbstentwickelten Android-App in der HiDrive-Cloud abgelegt werden. Da ein manueller Zugriff bereits per HiDrive App für Android erfolgreich war, erschien dem Kunden die Umsetzung als überschaubar. Tatsächlich kamen wir auf folgende Möglichkeiten zur Realisierung:

  • Zugriff auf ein eingehängtes HiDrive-Laufwerks, falls die HiDrive App ein entsprechendes Mounten vornimmt
  • Zugriff per HiDrive-API, die für Entwickler bereitgestellt wird
  • Zugriff per standardisiertem Protokoll (wie SFTP, SMB, usw)

Zugriff per eingehängtes HiDrive-Laufwerks der Android-App

Der direkte Zugriff auf das Android-Dateisystem erschien uns am einfachsten, wenn die Android-App das HiDrive-Verzeichnis in das lokale Dateisystem mountet. Dadurch würde die HiDrive-Authentifizierung per App erfolgen und wir könnten Dateien direkt ins Dateisystem schreiben.
Da dieser Weg nirgends dokumentiert war, fragte ich per Strato-Hotline nach, die uns von dieser Vorgehensweise abriet. Eigene Apps sollten nicht auf die Funktionen der HiDrive-App aufsetzen, da sie an Endanwender gerichtet sei und innere Funktionen mit jedem Update deaktiviert werden könnten.

Zugriff per HiDrive-API, die für Entwickler bereitgestellt wird

Die Strato-Hotline empfahl uns die Verwendung der HiDrive-API, die genau auf unsere Anforderungen ausgelegt sei. Dabei handelt es sich um eine REST-API, mit der man nach OAuth2-Authentifizierung die Dateien seines HiDrives verwalten kann.
Die API-Aufrufe sind gut dokumentiert und mit einer Version für die weitere Entwicklung versehen, wie man an dem folgenden Beispiel-Aufruf erkennt:

curl -X "GET" \ 
  -H "Authorization: Bearer " \ 
  -d "fields=id,name,created,refresh_token.expires" \ 
  https://api.hidrive.strato.com/2.1/app/me

Zugriff per standardisiertem Protokoll – z.B. SMB

Die Verwendung eines standardisierten Protokolls erschien uns weniger aufwändig als die Anbindung per HiDrive-API mit OAuth2-Authentifizierung. Insbesondere sind Versionsänderungen selten und man kann auf eine Vielzahl von Java-Bibliotheken zurückgreifen.
Wir entschieden uns für das SMB-Protokoll und nutzten die Bibliothek JCIFS (org.codelibs:jcifs:2.1.34), wobei wir noch ein paar Stolpersteine überwinden mussten:

  • bei Nutzung einer Fritz-Box erfolgt eine Timeout-Exception wegen standardmäßig aktivierter Firewall für NetBIOS (Haken bei „NetBIOS-Filter aktiv“)
  • falls die SMB-Klassen der Version 1 (Package ’smb1′) verwendet werden, wird eine SmbException ausgelöst: „This client does not support the negotiated dialect.“
  • Zugriff kann natürlich nur erfolgen, wenn der passende Pfad angegeben wird, z.B.: smb://smb3.hidrive.strato.com/root/users/-myuser-/
  • ich verwende gerne ‚commons-io‘ für einfache Datei-Operationen und außerdem benötigt die SMB-Bibliothek noch ihre eigenen Abhängigkeiten:

Wenn die Vorraussetzungen erfüllt sind, sollte der folgende Programmcode die Dateien im Root-Verzeichnis auflisten und eine Datei mit Inhalt erstellen.

import jcifs.CIFSContext;
import jcifs.Credentials;
import jcifs.context.SingletonContext;
import jcifs.smb.NtlmPasswordAuthenticator;
import jcifs.smb.SmbFile;
import jcifs.smb.SmbFileOutputStream;
import org.apache.commons.io.Charsets;
import org.apache.commons.io.IOUtils;

public class HidriveAccessWithSmb {

  public static void main(String[] args) throws Exception {
    String user = "my-user";
    String password = "my-password";
    String smbRootUrl = "smb://smb3.hidrive.strato.com/root/users/" + user + "/";

    Credentials authenticator = new NtlmPasswordAuthenticator(null, user, password);
    CIFSContext context = SingletonContext.getInstance().withCredentials(authenticator);

    System.out.println("Files in root directory:" );
    try (SmbFile rootDir = new SmbFile(smbRootUrl, context)) {
      for (SmbFile file : rootDir.listFiles()) {
        System.out.println("- " + file.getName());
      }
    }

    System.out.println("Write file in root directory:" );
    SmbFile smbFile = new SmbFile(smbRootUrl + "test-file.txt", context);
    try (SmbFileOutputStream outputStream = new SmbFileOutputStream(smbFile)) {
      IOUtils.write("Lorem ipsum ...", outputStream, Charsets.UTF_8);
    }
  }
}

Fazit

Der Zugriff auf die HiDrive-Cloud kann mit unterschiedlichen Techniken realisiert werden. Normalerweise sollte die HiDrive-API von Entwicklern genutzt werden, wobei die angebotenen standardisierten Protokolle einfachere Alternativen sein können.

Kommentare sind geschlossen.