Howto HTTP POST with auth+session cookies?

Hello,

I try to duplicate a function, which works nicely on command line, but fails in Node-RED.

Use-case is accessing the data from Tesla Powerwall 2 with authentication leveraging cookies.

The server requires authentication, and sends me back a token and auth+user cookies. I do get a successful authentication with a POST request and save the cookies into the form context. Next I trigger another POST to an API with the cookies.

The server seems to handle it, it accepts the authentication cookie, but is not able to continue for some reason and fails with 401 on user session.

So, what might be different from requesting through command line and node-red?

This is the working command line:

curl -k -O -c cookies.txt -X POST https://myPowerall/api/login/Basic -H "Content-Type: application/json" -d "{\"username\": \"customer\",\"email\": \"mymail.com\",\"password\": \"somepassword\"}"

curl -k -O -b cookies.txt https://myPowerall/api/meters/aggregates

The following is the Flow I've created:

[{"id":"4e97b6c0.e8021","type":"tab","label":"Flow 5","disabled":false,"info":""},{"id":"61253169.d2153","type":"inject","z":"4e97b6c0.e8021","name":"Form Data","props":[{"p":"payload"},{"p":"headers","v":"{\"Content-Type\":\"application/json\"}","vt":"json"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"{\"username\":\"customer\",\"email\":\"user_credential_as_email\",\"password\":\"a_great_password\"}","payloadType":"json","x":200,"y":100,"wires":[["a3a0b684.b246f8"]]},{"id":"a3a0b684.b246f8","type":"http request","z":"4e97b6c0.e8021","name":"","method":"POST","ret":"txt","paytoqs":"ignore","url":"https://myserver/api/login/Basic","tls":"420b13e0.06994c","persist":false,"proxy":"","authType":"","x":250,"y":200,"wires":[["e6aa1405.479b08"]]},{"id":"9ef45380.818898","type":"debug","z":"4e97b6c0.e8021","name":"","active":true,"tosidebar":true,"console":false,"tostatus":true,"complete":"true","targetType":"full","statusVal":"payload","statusType":"auto","x":890,"y":200,"wires":[]},{"id":"e6aa1405.479b08","type":"json","z":"4e97b6c0.e8021","name":"Ergebnis konvertieren","property":"payload","action":"","pretty":true,"x":500,"y":200,"wires":[["80d5302.45ca45"]]},{"id":"80d5302.45ca45","type":"change","z":"4e97b6c0.e8021","name":"Set Token","rules":[{"t":"set","p":"authCookies","pt":"flow","to":"responseCookies","tot":"msg"},{"t":"set","p":"token","pt":"flow","to":"payload.token","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":720,"y":200,"wires":[["9ef45380.818898"]]},{"id":"782da96c.acd058","type":"inject","z":"4e97b6c0.e8021","name":"Send Cookies","props":[{"p":"cookies","v":"authCookies","vt":"flow"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","x":250,"y":300,"wires":[["84dbabf.c551f58"]]},{"id":"84dbabf.c551f58","type":"http request","z":"4e97b6c0.e8021","name":"Aggregate","method":"GET","ret":"txt","paytoqs":"ignore","url":"https://myserver/api/meters/aggregates","tls":"420b13e0.06994c","persist":false,"proxy":"","authType":"","x":450,"y":300,"wires":[["55c339de.d607"]]},{"id":"55c339de.d607","type":"debug","z":"4e97b6c0.e8021","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":670,"y":300,"wires":[]},{"id":"420b13e0.06994c","type":"tls-config","name":"Ungeprüft Self-Signed","cert":"","key":"","ca":"","certname":"","keyname":"","caname":"","servername":"","verifyservercert":false}]

If I exclude the cookies, I get an access denied, so I can confirm authentication actually works.
What's puzzling me is, that the server also seems to try to use the same auth cookie again to identify the user session although there is a dedicated user_cookie, and fails there.

Any tips are very much appreciated!

Hallo BoernyMcFly,
hast Du eine Lösung für das Problem gefunden?
Seit die Powerwall auf 20.49 ist, bekomme ich mit Node-Red auch keine Daten mehr, da die Authentifizierung fehlt.
Ich habe schon viel mit dem Cookie Login rumgebastelt, es bisher aber nicht wieder zum Laufen bekommen.
Gruß

Nein leider nicht. Ich hänge hier.

Was mich wundert: ich krieg ja die Daten via Command-line. Lediglich die Abfrage per Node-RED klappt nicht.

Mit der neuen Firmware kommt man nur noch über die Cloud-API an die "Installateur" Funktionen ran, aber ich benötige die Daten nur für eine alternative Visu, also der Zugriff als "Customer" muss funktionieren.

Moin moin,

ich habe mal deinen Flow bei mir importiert. Hat der Zugriff bei dir vor dem Update funktioniert?

Ich gebe in der TLS Konfiguration das Tesla Zertifikat mit. Das konnte ich als Unterschied zu meiner Konfiguration feststellen.

Ich bekomme es seit dem Update allerdings auch nicht mehr zum Laufen. Ich möchte die Daten auch für eine andere Visu (Xsoulution).

Bei mir klappt allerdings nicht mal der Zugriff per command line.

Über die Tesla Gateway-Weboberfläche kann ich mich allerdings anmelden. Ich vermute mal, dass diese Zugangsdaten auch in die command line Abfrage müssen, oder?

Ich habe nämlich in etlichen Foren gelesen, dass manche als Kennwort die letzten 5 Zeichen von dem auf das Gateway aufgedruckten Kennwortes verwenden. Aber das muss man ja eigentliche nur beim ersten registrieren machen.

Welche Zugangsdaten verwendest du? Kannst du dich mit denen aus deiner cmd Abfrage auch an der Weboberfläche anmelden?

Gruß Jens

Hallo,

ich habe das sogar erst ab der Version 20.49 ausprobiert. Bei der erste curl Zeile musst du wirklich bei username "customer" reinschreiben. E-Mail ist dann die Registrierung/Nutzername in der Gateway UI und Password ist klar. Mit der erste curl Anfrage werden die Auth Cookies abgeholt. die zweite holt dann die Daten ab. Geht einwandfrei. Wenn du bei der zweiten Zeile die Option -O weglässt erhältst du die Ausgabe direkt im Terminal.

Ich hab's jetzt auch per GET ausprobiert. Kein Unterschied.

Die 5 Zeichen sind nur beim Passwort-Reste nötig. Das hatte ich vorher tatsächlich gemacht ... und ich hab noch immer nicht meine Zustimmung für die Cloud-App/Datenverwaltung gegeben, aber trotzdem funktioniert die weiterhin :wink: Tesla ist auch ein Datenmonster.

viel Erfolg! Vielleicht kriegen wir's ja doch noch gemeinsam hin.

Ok. Dann muss ich mal noch ein wenig testen, damit ich zumindest auch erstmal in der command line ein Ergebnis bekomme.

Habe dir hier mal meinen Flow kopiert. Mit diesem hat es bis zur 20.49 einwandfrei funktioniert.

Da ist man an die Daten lokal aber auch ohne Authentifizierung rangekommen.

Es könnte bei dir aber trotzdem evlt. an dem fehlenden Zertifikat liegen. Ohne dieses Zertifikat hatte ich selbst ohne Authentifizierung keine Daten bekommen.

[{"id":"7394f41d.243b9c","type":"tab","label":"Flow 2","disabled":false,"info":""},{"id":"165885bd.c0ea4a","type":"http request","z":"7394f41d.243b9c","name":"test","method":"GET","ret":"obj","paytoqs":false,"url":"[https://192.168.XXX.XXX/api/meters/aggregates](https://192.168.XXX.XXX/api/meters/aggregates)","tls":"22fcf1ef.a1e34e","proxy":"","authType":"","x":331,"y":150,"wires":[["c8a77b22.b14c28"]]},{"id":"cb7344f8.bf7468","type":"inject","z":"7394f41d.243b9c","name":"","topic":"","payload":"","payloadType":"date","repeat":"10","crontab":"","once":true,"onceDelay":0.1,"x":164,"y":148,"wires":[["165885bd.c0ea4a"]]},{"id":"5280ad20.038544","type":"debug","z":"7394f41d.243b9c","name":"Haus Verbrauch","active":true,"tosidebar":true,"console":true,"tostatus":true,"complete":"payload","targetType":"msg","x":960,"y":134,"wires":[]},{"id":"b1b0326.c6314d","type":"function","z":"7394f41d.243b9c","name":"Haus Verbrauch","func":"var test = msg.payload.load.instant_power;\nmsg.payload = test;\nreturn msg;","outputs":1,"noerr":0,"x":680.5,"y":131,"wires":[["9acd395.17e81c8"]]},{"id":"c8a77b22.b14c28","type":"json","z":"7394f41d.243b9c","name":"","property":"payload","action":"obj","pretty":false,"x":488.5,"y":148,"wires":[["b1b0326.c6314d"]]},{"id":"9acd395.17e81c8","type":"udp out","z":"7394f41d.243b9c","name":"","addr":"192.168.XXX.XXX","iface":"","port":"5003","ipv":"udp4","outport":"","base64":false,"multicast":"broad","x":997.5,"y":74,"wires":[]},{"id":"22fcf1ef.a1e34e","type":"tls-config","z":"","name":"","cert":"","key":"","ca":"","certname":"","keyname":"","caname":"ttt.cer","servername":"","verifyservercert":false}]

Hallo,

mittlerweile bin ich jetzt genau so weit wie du. Scheitere aber genau am gleichen Problem.

Hast du das hier schon gesehen?

https://cookbook.nodered.org/http/work-with-cookies

Habe mal versucht deinen Flow und diesen zu kombinieren. War aber bisher leider nicht erfolgreich. Hatte aber leider auch noch nicht all zu viel Zeit zum basteln.

Vielleicht kommst du ja mit diesem Flow weiter.

Gruß Jens

Also über die HTTP Node habe ich immer noch keine Lösung. Ich habe mich nun damit beholfen, einfach die curl-Befehle über die Exec Node auszuführen. So bekomme ich immerhin die aktuellen Erzeugungs- und Verbrauchsdaten. Interessanterweise klappt es nicht die Aktuelle Kapazität auszulesen, obwohl im Webinterface diese Daten auch dem Kundenzugang zur Verfügung stehen.

Ich bin leider auch noch nicht weitergekommen. Habe schon vieles ausprobiert.

Könntest Du mir mal bitte Deinen Flow mit dem Exec Node zum Import schicken.

Danke

This topic was automatically closed 60 days after the last reply. New replies are no longer allowed.