nemiah / phpFinTS

PHP library to communicate with FinTS/HBCI servers
MIT License
130 stars 39 forks source link

Best Practice Strong-Authentication #417

Open luggesexe opened 9 months ago

luggesexe commented 9 months ago

Hallo, ich implementiere hier grade die Library für Web und einen gleichzeitig laufenden Cronjob. Die Erklärung unter login.php habe ich gelesen, frage mich aber wie hier die Best Practices sind bzw. wie das hier in der Runde so umgesetzt wird. Das Problem welches ich hier sehe ist, wenn der Cronjob die handleStrongAuth-Function aufruft gibts alle 5 Minuten eine Push-Nachricht aufs Handy, im Fall der Fälle die ganze Nacht durch.

Meine Idee wäre ja gewesen die Ausgabe von $getSepaAccounts = \Fhp\Action\GetSEPAAccounts::create(); zu speichern und dann auf einer anderen Seite die handleStrongAuth Funktion mit dem Wert aufzurufen (den Plan habe ich verworfen, die Funktion erzeugt keinen eindeutigen mit der Bank ausgemachten Wert wie ich es zuvor dachte. Problem: Web und Cron greifen auf die gleichen Funktionen zu. Trennen geht ja aber auch schlecht, auch der Cron braucht ggf. alle 90 Tage die Autorisierung und sollte nicht stumm weiterlaufen.

Wie löst man einen solchen Konflikt Best Practice am besten?

ampaze commented 8 months ago

Da es immer eine TAN beim Login geben kann, ist ein Cronjob eigentlich ungeeignet. Wenn Cronjob dann müsste er sich selbst selbst stilllegen sobald die Bank nach einer TAN gefragt hat.

Wir haben es so gelöst, dass der Abruf händisch ausgeführt wird und der Mitarbeiter ggf. die TAN eingeben kann. Es ist imho eigentlich egal ob man die Nacht hindurch alle 5 Minuten abruft oder einmal morgens. Zumindest wenn es um eingehende Überweisungen geht kann man eine 100% automatische Verarbeitung der Umsätze sowieso vergessen.

fbett commented 8 months ago

Wir lassen auch einen Cronjob laufen und sobald ein Tan benötigt wird, wird der Cronjob angehalten (damit nicht alle X mins eine Push-Nachricht versendet wird).

Es gibt bei der normalen Abfrage der Bankdaten zwei Punkte an denen ein Tan benötigt werden könnte:

$loginAction = $connector->login();
if($loginAction->needsTan()) {
     // Stop it and send a message
}

und später

$getSepaAccountsAction = \Fhp\Action\GetSEPAAccounts::create();
$connector->execute($getSepaAccountsAction);
if($getSepaAccountsAction->needsTan()) {
    // Stop it and send a message
}
lukas-staab commented 8 months ago

Ein Hinweis vielleicht noch: wenn man nur die Täglichen Umsätze abrufen will (oder die der Woche) braucht man bei den Umsätzen eigentlich keine Tan. Beim Login aber gesichert alle 90 Tage. Wenn man also Hochfrequent genug abruft, und sicherstellt das man sich immer mal Manuell einloggt ist man einigermaßen auf der sicheren Seite. Bei meiner Bank ist es wohl auch egal ob ich mich ins online Banking einlogge, oder via cmd. Beides geht auf den selben Counter mit dem Account.

luggesexe commented 8 months ago

Dankeschön für eure Hinweise und Ideen. Ich stoppe den Cronjob entsprechend. @lukas-staab ich habe mir das StuFis-Projekt mal angesehen in dem ja auch die FinTS-Bibliothek eingerichtet ist. Ich habe nicht ganz erkennen können.

(a) findet nach dem Schlosssymbol bei hinterlegtem TAN-Modus der gesamte Prozess auf einer Seite statt, sollte eine TAN mit NeedsTanException benötigt werden? (b) Wie handhabt ihr keine benötigte TAN? Ist dann ein klick auf das Icon nicht möglich oder erscheint dann eine Erfolgsmeldung z.B.?

Beides ließ sich in der DEMO-Instanz nicht ganz nachvollziehen, ich würde das ganze dann in dem Symfony-Projekt ähnlich handhaben.

lukas-staab commented 8 months ago

Eins vorab: ich bin nicht ganz sicher ob ich den Code so wieder schreiben würde, ich finde ihn etwas unübersichtlich aber ich war froh das es funktioniert hat :)

a) Ich hab es so gelöst das die Tan Exception nur dann geworfen wird wenn man eine braucht und dann auch das entsprechende Template gerendert wird. b) Ansonsten läuft es einfach durch und man kommt da an wo man wollte.

In der Demo Instanz ist das nicht gemockt, entsprechend müsste man Echte Daten eingeben, da das eine öffentliche Demo Instanz ist würde ich davon aber eher abraten ...