hbci4j / hbci4java

Java-based FinTS protocol implementation that supports all features (chipTAN, pushTAN, HHD, SEPA, PSD2,...)
GNU Lesser General Public License v2.1
147 stars 49 forks source link

Support für PushTAN 2.0 (Decoupled Verfahren) #74

Closed danielr1996 closed 8 months ago

danielr1996 commented 1 year ago

I noticed that in order to access all statements (Umsätze) I need to provide an actual TAN consisting of six digits and displayed in the S-Push TAN app, whereas when viewing all statements on the Sparkasse Webinterface I can just swipe in the app to confirm the action.

Is this something hbci4j can also support, or is this simply not supported with the hbci api? A few years ago I tried implementing a hbci client myself in nodejs (boy is that an ugly API) and I remember that there were different numerical codes to request different tan schemas, e.g. comdirect supported smstan or phototan. If I remember correctly there was also a method to request the available tan methods from the api.

From a developer perspective this would be way more easy to implement as I wouldn't need to implement means of supplying the tan but can just wait for the user to confirm the request in the app.

willuhn commented 1 year ago

Du kannst hier auf Deutsch schreiben. FinTS wird ohnehin nur in Deutschland verwendet. Dieses neue TAN-Verfahren nennt sich "PushTAN 2.0" - bzw. laut offizieller Spezifikation "Decoupled-Verfahren". Per Webseite unterstützen es schon viele Banken, per FinTS nach meinem Wissen bisher nur die Sparkassen. Voraussetzung für den Support in FinTS ist die Unterstützung von HKTAN in Version 7 (ist bereits in HBCI4Java enthalten). Damit es genutzt werden kann, muss aber noch das eigentliche Austauschverfahren implementiert werden, wie unter https://www.hbci-zka.de/dokumente/spezifikation_deutsch/fintsv3/FinTS_3.0_Security_Sicherheitsverfahren_PINTAN_2020-07-10_final_version.pdf in Kapitel B.4.2.2 beschrieben. Das ist in HBCI4Java bisher noch nicht umgesetzt. Im Prinzip muss hier eine Funktion implementiert werden, die in einem separaten Thread mit der laufenden FinTS-Session bei der Bank pollt, ob die Freigabe durch den User bereits erfolgt ist. Währenddessen muss der Main-Thread mit der eigentlichen Ausführung des Geschäftsvorfalls pausiert werden. Nach der Rückmeldung der Freigabe über den zweiten Thread kann der Main-Thread dann fortsetzen. Ist wie gesagt noch nicht implementiert.

danielr1996 commented 1 year ago

Wie würde so eine Implementierung den Aussehen, ist das nur ein weitere Case in der HBCICallback Implementierung und das pollen einfach nur ein weiterer GV der über die Job Queue abgeschickt werden kann, oder muss man dafür tief in die Innereien von HBCI4J eintauchen?

Ich hab jetzt auf jeden Fall ne funktionierende Lösung mit der bisherigen Umsetzung, deswegen belass ich es erstmal dabei da ich nicht nochmal meinen Account sperren will weil ich zu oft eine Pin anfordere aber nicht bestätige :D

Sollen wir den Issue noch offen lassen falls jemand anders sich die selbe Frage stellt?

willuhn commented 1 year ago

Das Thema ist leider nicht einfach mit einem weiteren Callback umgesetzt. Wie ich schon schrieb: An der Stelle muss ein Multi-Threading eingebaut werden, um parallel in einem zweiten Thread HBCI-Nachrichten für das Status-Pollen senden zu können, während der Haupt-Thread wartet.

Ich lasse das Issue mal offen.

DominikHolzapfel commented 9 months ago

Hallo, ich bin im Rahmen eines Tests auf dieses Problem gestoßen. Im Zuge dessen habe ich mir angeschaut, wie Banking4 von Subsembly dieses Problem löst. Nachdem eine Transaktion angestoßen wird, wartet die Anwendung auf die Bestätigung des Nutzers (manuell per Knopfdruck), dass die Freigabe in der App erfolgt ist. Daraufhin wird ein Request mit einem HKTAN Request zum Server gesendet, um den Status der Transaktion zu prüfen. Sollte die Freigabe in der App tatsächlich erfolgt sein, geht der Flow weiter, ansonsten kommt derselbe Dialog einfach zurück und der Nutzer wird erneut aufgefordert, "Ok" zu drücken.

Ist mit so einem Vorgehen noch Multi-Threading notwendig? Oder wäre es mit expliziter Nutzer-Eingabe eventuell einfacher?

Ich kann auch gerne Beispiel Request/Response Paare zur Verfügung stellen, falls das hilft.

willuhn commented 9 months ago

Ja, möglicherweise würde es damit ohne separaten Thread im Hintergrund funktionieren.

willuhn commented 8 months ago

Hatte vergessen, das Ticket zu schliessen. Ist seit 22.12.2023 mit HBCI4Java 3.1.74 umgesetzt. Es gibt hierzu einen neuen Callback NEED_PT_DECOUPLED, der im HBCICallback implementiert werden muss. Dieser muss lediglich einen Warte-Dialog mit der Message der Bank anzeigen sowie einen OK-Button, auf den der User klicken soll, sobald er die Freigabe in der Push-TAN-App durchgeführt hat.

willuhn commented 8 months ago

Für's Protokoll noch die damit verbundenen Commits: