Eine eigene PHP-Web-API bauen

Um Daten aus dem SmartHome auf eine eigene Website zu bringen, habe ich mir eine Authentifizierung gebaut, die es mir erlaubt, per POST Request Daten bereitzustellen – und zwar nur mir. Einfach nur ein festes Passwort war mir da zu unsicher. Daher habe ich eine zeitbasierte Komponente mit eingebaut.

Zum Einsatz kommt seitens Node-RED node-red-contrib-cryptography.

Ich generiere einen Auth Token, dieser basiert auf der aktuellen Zeit und einem geheimzuhaltenden Passwort, quasi einem Salt.

msg.payload = Math.round(Date.now()/10000) + "dasGeheimePasswort1234!";
msg.headers = {};
msg.headers["Content-Type"] = "application/x-www-form-urlencoded";
return msg;

Beim Token habe ich mich für eine Gültigkeit von 10 Sekunden (daher geteilt durch 10.000) entschieden, dann sind minimale Ungenauigkeiten bei den Uhrzeiten zwischen SmartHome und Webserver nicht so dramatisch. Der Payload wird dann durch die hash-Funktion sha256 gehasht. Anschließend wird der POST Request mit Daten bepackt und der http request abgeschickt.

msg.payload = {
"auth": msg.payload,
"temperatur": msg.temperatur
};
return msg;

Um dem POST Request zu empfangen und zu authentifizieren muss die PHP Gegenstelle den gleichen Token generieren und mit dem mitgeschickten Token abgleichen. Dazu braucht die Gegenstelle natürlich auch den auf 10 Sekunden gerundeten Timestamp und das gleiche geheime Passwort, wie es im Node-RED hinterlegt ist.

<?php
   if($_POST["auth"] == hash('sha256',(round(time()/10))."dasGeheimePasswort1234!")) {
echo "true";
}
?>

Achtung! PHP arbeitet bei den Timestamps in Sekunden, während JavaScript in Millisekunden arbeitet. Daher ist hier nur eine Division durch 10 nötig.

Statt dem echo „true“; kann man natürlich beliebiges mit den mitgeschickten Werten anfangen.

3 Gedanken zu „Eine eigene PHP-Web-API bauen“

  1. Hallo Lukas, bin auch begeisteter Nutzer von IOBroker und möchte meine eigene VISU in Html und JS bauen. Ein Problem an dem ich scheitere, ist HTTP request.
    Kannst du helfen? Wie muss ein Html Schnippsel aussehen um Datenpunkte von IOBroker zu lesen und schreiben zu können.
    Oder hast du einen Link wo man das konkret nachlesen kann?
    Habe bisher so etwas nicht gefunden.
    Welchen Shelly hast du als Rollladenaktor verwendet?

    Danke und Grüße Ingolf

    1. Hallo Ingolf,

      als Rolladenaktoren verwende ich die Shelly 2.5 mit Originalfirmware, siehe hier.

      Um per HTTP Request Werte in ioBroker zu schreiben und lesen gibt es erstmal zwei Möglichkeiten:
      1. entweder du nutzt den iobroker.simple-api Adapter. Er ermöglicht dir Zugriff auf alle ioBroker Objekte. Wie die Anfragen funktionieren, ist im README dazu m.E. gut erklärt.
      2. oder du baust dir eine eigene HTTP-„Schnittstelle“ in Node-RED. Dies ist dann immer eine Kombination aus http in-Node, http response-Node und ioBroker get bzw. ioBroker out-Node.
      Wenn du weiterführende Logiken und Automatisierungen eh in Node-RED realisieren willst/bereits realisierst, ist dieser Weg wahrscheinlich sinnvoller.

      Viele Grüße,
      Lukas

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert