# Datei Download vom Server



## Joob (15. Mrz 2022)

Ich habe folgende Frage:

Ich möchte gerne Dateien von einem Server downloaden, uploaden und löschen.
Das habe ich auch schon programmiert.
Läuft alles per SFTP mit jsch.
Soweit so gut.

Da ist nur die Sache mit dem Usernamen, Passwort und dem SSHPublicKey.
Wie macht man so was. Es heißt doch man soll keine Passwort beim Client haben sondern nur auf dem Server.
Nur wie soll ich dann per SFTP herunterladen.

Ich hatte an PHPScript gedacht, aber wenn ich das auf dem Server ausführe liegt die Datei am Ende auf dem
Server, ich will sie aber zum Client bekommen.

Am liebsten würde ich einen http Request auf ein PHP schicken, welches dann die Datei als Stream oder so ausgibt und
diesen Stream dann beim Client als Datei speichern. Damit könnte ich alle Passwort auf dem Server behalten.

Wie macht man so was richtig.


----------



## httpdigest (15. Mrz 2022)

Die Frage ist hier nicht, ob per SFTP oder PHP etc., bzw. wie genau du die Datei nun vom Server zum Client bekommst, sondern:
1. Muss der Client gegenüber dem Server nachweisen, wer er ist?
2. Muss der Benutzer/User, der den Client benutzt, beweisen, wer er ist?

Die Beantwortung der 1. Frage mit "ja" wird darauf hinauslaufen, dass du ein Vertrauensverhältnis zwischen dem Client und dem Server etablieren musst. Hier besteht aber _immer_ die Unsicherheit, dass dieses Vertrauensverhältnis gebrochen wird und sich z.B. andere Clients als _dein_ Client ausgeben, indem sie z.B. Zertifikate oder andere Secrets/Credentials auf deinem Client auslesen.

Üblicherweise wählt man 2. Hier wird kein Vertrauensverhältnis zwischen Client und Server vorausgesetzt, sondern nur zwischen Benutzer/User und Server. Dem Benutzer wird also vertraut, dass er etwas weiß, jemand _ist_ oder etwas hat (die drei Typen von Information für Authentifizierung), womit er sich gegenüber dem Server authentifizieren kann.
Du hinterlegst also keine Credentials im Client, sondern beim User/Benutzer.


----------



## Joob (15. Mrz 2022)

Wenn Du von User/Benutzer redest, dann meinst Du den Benutzer des Servers oder.

Was genau meinst Du mit Credentials im User, um diese zu verwenden müsste ich wieder Zugangsdaten im Client haben.

Wenn das Du den User auf dem Server meinst muss ich mich doch als dieser auf dem Server einloogen.
Wenn ich also SFTP in der Java App auf dem Clientrechner starte muss ich doch dort die Zugangsdaten haben.

Ich hatte an etwas anderes gedacht.
Hab gerade mal versucht meine Vorstellung zu beschreiben ist nicht gut aber eventuell hilfreich um mich zu verstehen. Dafür könnte ich meine neue Api verwenden.

*download*
copyJob (From, to) im Client


From
ist ein HttpRequest(POST) wobei auf dem Server PHP Script aufgerufen wird in dem ein SFTP ausgeführt wird welches eine Datei zurückgibt


To
Pfad der zum Lokalen Verzeichniss


*upload*
sendJob (From, to) im Client


From
Pfad und Name der Lokalen Datei


To
httpRequest (put ?) wobei auf dem Server ein PHP aufgerufen wird in dem ein SFTP läuft um die Datei auf dem Server zu speichern als
Pfad Datei als Parameter 


*DELETE*
DeleteJob
httpRequest (POST) in dem ein SFTP ähnlich jsch auf gerufen wird um die Datei zu löschen.
Damit hätte ich keine Zugriffdaten auf dem ClientPC und könnte sogar auf weitere nachgeordnete Server zugreifen.


----------



## httpdigest (15. Mrz 2022)

Joob hat gesagt.:


> Wenn Du von User/Benutzer redest, dann meinst Du den Benutzer des Servers oder.


Nein. Ich meinen den Benutzer deines Clients also deiner Anwendung auf Nutzerseite, zu der du eine Datei vom Server herunterladen möchtest.


Joob hat gesagt.:


> Was genau meinst Du mit Credentials im User, um diese zu verwenden müsste ich wieder Zugangsdaten im Client haben.


Nein. Nur der *Benutzer* hat die Credentials, nicht der _Client_. Der Benutzer ist der Mensch. Der Client ist deine Anwendung, die vom Bentzer bedient wird. Im einfachsten Fall muss der Client also den Benutzer zur Eingabe der Credentials auf irgendeine Art und Weise _auffordern_.

Das Schema, was du eben beschreibst, würde bedeuten, dass überhaupt keine Zugriffssicherung besteht und _jeder_ mögliche Client die Datei herunterladen könnte. Das kannst du natürlich so machen, wenn du keine Zugriffssicherung brauchst.


----------



## KonradN (15. Mrz 2022)

Du hast die Zugangsdaten beim User. Der gibt diese ein. Im Idealfall noch nicht einmal in Deiner App (Das ist dann die übliche Autorisierung z.B. auf einer Webseite z.B. direkt bei Google). Dann hast Du nur noch einen Autorisierungscode für Deine App, der dann auch nur für Deine App gültig ist (die hat also auch einen "Secret Key", den Du nicht weiter geben solltest).

Bei SFTP könntest Du den Zugang z.B. über einen private Key absichern. Aber das Problem ist halt: Jeder, der den Key irgendwie extrahiert bekommt, der hat dann beliebig Zugriff.


----------



## Joob (15. Mrz 2022)

In dem beschriebenen Schema gehe ich davon aus das der Connect zum Serv.Benutzer im PHP passiert und dann per SFTP eine Datei aus dem Serv.Benutzer geladen werden kann.


----------



## Joob (15. Mrz 2022)

Ich muss glaube ich mal erklären.

es gibt eine App welche auf lokalen Rechnern läuft die nicht im einem Netzwerk arbeiten.
es gibt einen Server mit einem Benutzer der alle Daten der Benutzer verwaltet, dabei wird eine DB verwendet
was aber jetzt keine Rolle spielt,  es sind die Dateien wie Soundfiles, Movies, Texte, PDFs und Bilder.

Ich würde gerne diese Datei zum Benutzer bekommen ohne das ich Zugangsdaten bei Ihm habe.
Die Api habe ich durch Token und die Servereinstellungen abgesichert.


----------



## Joob (15. Mrz 2022)

Ach jetzt bin ich nicht richtig auf httpdigest eingegangen. Ja die Clients dürfen die Dateien herunterladen und verwenden, aber du hast recht das ich nicht unbedingt möchte das von außerhalb des Programms mit seiner Logik Dateien manipuliert werden, das ist aber durch den Token gewährleistet.


----------



## KonradN (15. Mrz 2022)

User ohne  Authentifizierung sollen Dateien bekommen ... das kannst du nicht wirklich absichern. Die API bietet nur Security by Obscurity - und das wird früher oder später schief gehen.

Dazu reicht es ja schon, das Programm mit einem Debugger zu verfolgen um so den ganzen Traffic unverschlüsselt mitzulesen.


----------

