Hallo liebe Entwickler,
ich habe ein Modul zur Steuerung von Hausgeräten entwickelt, welches mit einer Cloud-API des Anbieters "Home Connect" kommuniziert (Details im Wiki (https://wiki.fhem.de/wiki/HomeConnect)).
Die Anmeldung an diesen Cloud-Dienst erfolgt mit Oauth 2.0. Hierbei generiert FHEM einen Link auf den Anmeldeserver, und dieser macht nach erfolgreichem Login einen redirect zurück zu FHEM. Dieses Verfahren funktioniert seit der Einführung von csrf nicht mehr.
OAuth bietet natürlich eine Unterstützung für CSRF-Protection: Ich kann ein Attribut "state" im Login-Request definieren, welches danach im Redirect wieder auftaucht. Jedoch ist der Name "state" fest im Protokoll definiert und kann nicht zu "fwcsrf" umbenannt werden.
Daher nun meine Frage: Könnte FHEM anstelle von einer Auswertung des einen Attributs "fwcsrf" den gesamten Request-String nach dem Token durchsuchen? Oder vielleicht zusätzlich nach "state" schauen? Oder so ein Verhalten konfigurierbar machen?
Vielen Dank für ein feedback
Stefan
csrfToken ist optional (siehe Doku), man kann ihn auf einen festen Wert setzen, oder die zufaellig generierte vor dem Spezifizieren des Links abfragen. Die Vorschlaege zur Verbesserung kann ich erst beurteilen, wenn ich das Problem besser kenne, z.Bsp. anhand von einem konkreten Beispiel.
Hallo Rudolf, vielen Dank für die schnelle Antwort.
Viel konkreter kann ich fast nicht werden, aber ich hab ein Beispiel. Der folgende Link ist der Redirect, den Home Connect nach Abschluß der Anmeldung generiert:
http://fhtest:8083/fhem?cmd.Test=set%20hcconn2%20auth%20&code=eyJ4LXJlZy...yJ9&state=csrf_147948606605141&grant_type=authorization_code
Er besteht aus der redirect URL, die bei der Registrierung der Applikation in der Home Connect Cloud vordefiniert werden muss, dem code den ich zur späteren Kommunikation mit dem API brauche, dem State (in den ich das csrf Token geschrieben habe) und dem vom Protokoll fest vorgegebenen "grant type" der nichts zur Sache tut.
Diese URL produziert im Log den
2017.06.12 12:51:06.215 3: FHEMWEB WEB CSRF error: ne csrf_147948606605141. For detals see the csrfToken FHEMWEB attribute
Natürlich kann man csrf abschalten aber das ist unpopulär.
Du kannst im der Rücksprung Adresse keine eigenen Parameter angeben?
In der URL kann ich zwar Parameter angeben, aber nachdem sich das csrf Token bei jedem Start ändert, ist dies nicht praktikabel.
Das einzige Attribut was ich dynamisch belegen kann ist eben dieses "state"
Das bedeutet dass es zumindest bei statisch gesetztem Token problemlos funktioniert.
Fang doch einfach mal damit an.
Ok, ich werde die Verwendung eines statischen Tokens in meiner Wiki Page dokumentieren. Ist wahrscheinlich immer noch sicherer als kein Token zu benutzen.
Ist fast genauso sicher wie ein dynamischer Wert.
Wie oft wird der Aufruf denn gebraucht? Kannst du die Rücksprungadresse im nachhinein ändern? Falls ja, probier doch ob du das nicht automatisieren kannst. Oder behandle den Call komplett im Modul statt über ein Set zu gehen.
Schau dir mal den Webhook bei Netatmo an.
Zitat von: Markus M. am 12 Juni 2017, 15:06:43
Ist fast genauso sicher wie ein dynamischer Wert.
Wie oft wird der Aufruf denn gebraucht? Kannst du die Rücksprungadresse im nachhinein ändern? Falls ja, probier doch ob du das nicht automatisieren kannst. Oder behandle den Call komplett im Modul statt über ein Set zu gehen.
Schau dir mal den Webhook bei Netatmo an.
Das NUKIDevice Modul verwendet auch ein Recall/Webhook und macht das ganze Modulintern.