{"id":1742,"date":"2022-09-11T17:51:37","date_gmt":"2022-09-11T15:51:37","guid":{"rendered":"https:\/\/www.rustimation.eu\/?p=1742"},"modified":"2024-09-03T11:38:19","modified_gmt":"2024-09-03T09:38:19","slug":"geofencing-experimente-mit-der-locative-app-teil-1","status":"publish","type":"post","link":"https:\/\/www.rustimation.eu\/index.php\/geofencing-experimente-mit-der-locative-app-teil-1\/","title":{"rendered":"Geofencing Experimente mit der Locative App <br> Teil 1: PHP"},"content":{"rendered":"<p><span style=\"color: #808080;\">Nach sehr langer Pause hat mich <\/span><span style=\"color: #808080;\">wieder <\/span><span style=\"color: #808080;\"> einmal die Lust am Basteln und Experimentieren gepackt&#8230; Also, auf geht's:<\/span><\/p>\n<h2>Was ist Geofencing?<\/h2>\n<p>Im Zuge des Vormarschs von Internet of Things (IoT) Produkten kommt vermehrt auch <em>Geofencing <\/em>zum Einsatz. <strong>Geofencing<\/strong> ist ein Kunstwort, zusammengesetzt aus den Begriffen \"Geo\" (Erde oder auch abgek\u00fcrzt f\u00fcr Geographie etc.) und \"Fence\" (engl.: Zaun). Ein Geofence ist ein virtueller Zaun um einen bestimmten Punkt herum, bei dessen \u00dcberschreiten in die eine oder andere Richtung ein Ereignis (Heizungssteuerung, Licht an\/aus, Garagentor auf\/zu etc.) ausgel\u00f6st wird.<!--more--><\/p>\n<p>Beispielsweise bietet <a href=\"https:\/\/tado.com\" target=\"_blank\" rel=\"noopener\">Tado<\/a> smarte Heizk\u00f6rper Thermostate an, die beim Verlassen deiner Wohnung die Temperatur senken und beim Ann\u00e4hern die Temperatur hochstellen. Clever! Ebenso bietet z.B. Viessmann eine kostenpflichtige Erweiterung seiner <a href=\"https:\/\/www.viessmann.family\/de\/newsroom\/loesungsangebot\/sofort-energie-sparen-mit-der-vicare-app\" target=\"_blank\" rel=\"noopener\">Vicare<\/a> L\u00f6sung an, die Geofencing beinhaltet. Nat\u00fcrlich gibt es noch viele andere Anwendungsf\u00e4lle.<\/p>\n<p>In der Regel ist daf\u00fcr eine App auf dem Smartphone installiert, die laufend den eigenen Standort abfragt und bei \u00dcberschreiten des virtuellen Zauns ein Kommando ausl\u00f6st. Das Kommando wird in der Regel \u00fcber die Cloud des Anbieters geleitet. Das hat den Vorteil, dass ein &#8211; hoffentlich &#8211; gut gesch\u00fctzter Server existiert, der 24\/7 empfangsbereit ist und der seinerseits die empfangenen Kommandos verschl\u00fcsselt und abgesichert an die IoT Steuerung zu hause bei dir weiterleitet.\u00a0 Ich pers\u00f6nlich mag solche Clouds nicht besonders, da vor allem Nicht-EU Anbieter die Daten meist weiterverkaufen.<\/p>\n<p>F\u00fcr mich selbst habe ich eine einfache L\u00f6sung gesucht, die meine Au\u00dfenbeleuchtung einschaltet, wenn ich abends nach Hause komme &#8211; und das m\u00f6glichst ohne irgend eine Cloud eines mehr oder minder obskuren Anbieters zu nutzen.<\/p>\n<h2>Was ben\u00f6tige ich dazu?<\/h2>\n<ul>\n<li>ein iPhone oder iPad mit installierter kostenloser Locative App, Zugriff auf Standort muss auf 'immer' eingestellt sein<\/li>\n<li>einen Raspberry Pi mit irgend einem Webserver und php 7.4<\/li>\n<li>eine aus dem Internet erreichbare Webadresse<\/li>\n<li>Alternativ kann man auch einen anderen aktiven Webserver (z.B. bei einem Provider) nehmen, sofern man dort php hinzugebucht hat. Ein reiner Webspace reicht nicht aus. Bei so einer L\u00f6sung kann man nat\u00fcrlich nicht innerhalb seines privaten Netzwerks arbeiten sondern muss alles \u00fcbers Internet abwickeln.<\/li>\n<\/ul>\n<h2>Zielgruppe &#8211; Disclaimer<\/h2>\n<p>Dieser Artikel wendet sich an wohlmeinende Amateure, die gerne mehr \u00fcber Geofencing wissen wollen und eventuell selbst eine L\u00f6sung bauen m\u00f6chten. Da ich beileibe kein professioneller Programmierer bin, werden manche Profis und Experten sicher \u00fcber den einen oder anderen Punkt schmunzeln oder die Stirn runzeln &#8211; ich erhebe keinerlei Anspruch auf Professionalit\u00e4t oder \"Wasserdichtigkeit\" meiner vorgestellten Experimente.<\/p>\n<h2>Die Locative App<\/h2>\n<p>Im Apple App Store habe ich die kostenlose App <a href=\"https:\/\/www.locative.app\/\" target=\"_blank\" rel=\"noopener\"><strong>Locative<\/strong> <\/a>von <a href=\"https:\/\/www.bearologics.com\/\" target=\"_blank\" rel=\"noopener\">Bearologics<\/a> gefunden, die genau das tut was ich will. Sie kann auf einem iPhone oder iPad bis zu 20 virtuelle Z\u00e4une aufspannen und entsprechend Kommandos an einen beliebigen Empf\u00e4nger (Server) schicken. Das kann ein bei einem Webhoster liegender Server sein oder, wie in meinem Fall, ein selbst betriebener Server auf einem Raspberry Pi. Dieser Server sollte allerdings aus dem Internet erreichbar sein, sonst bringt die ganze Chose nichts.<\/p>\n<p>Das Besondere an Locative ist, dass es komplett ohne \"company in the middle\" auskommt. Au\u00dferdem erhebt Bearologic lt. Auskunft des App Stores auch keinerlei Nutzerdaten.<\/p>\n<p>Die kostenfreie App ist weitgehend ohne Dokumentation, erschlie\u00dft sich aber im Laufe der Experimente von selbst. Auch das Userinterface erscheint manchmal etwas unausgereift &#8211; die wichtigsten Punkte erkl\u00e4re ich aber hier.<\/p>\n<p>Es scheint auch eine \u00e4ltere Version f\u00fcr Android zu geben (APK Download aus 2018), inwieweit diese funktioniert, kann ich nicht sagen. Wer Android nutzt, hat m.E. sowieso weniger Bedenken, seine Daten an Datenkraken wie Google abzutreten; also ist eine datensparsame L\u00f6sung wie Locative m\u00f6glicherweise nicht so relevant.<\/p>\n<p>Wichtig zu wissen: F\u00fcr viele fertige IoT Hausautomatisierungssysteme wie FHEM, Home Assistant etc. gibt es entsprechende Locative Adapter. Wer so ein Teil sein eigen nennt, braucht nicht unbedingt weiterlesen.<\/p>\n<p>Im <a href=\"https:\/\/www.rustimation.eu\/index.php\/geofencing-experimente-mit-der-locative-app-teil-2\/\">n\u00e4chsten Beitrag<\/a>\u00a0<span style=\"color: #ff0000;\"><span style=\"color: #000000;\"> erkl\u00e4re ich, wie man Locative mit Node-Red zum Fliegen bringt.<\/span> <\/span><\/p>\n<h3>Einrichten der App<\/h3>\n<p>Die App hat insgesamt nur vier Screens:<\/p>\n<ul>\n<li>Den <em>Orte<\/em> Screen zum Einrichten und Konfigurieren der maximal 20 Geofences<\/li>\n<li>Den <em>Benachrichtigungen <\/em>Screen, auf dem dann im Echtbetrieb die Ereignisse (kommen\/gehen) angezeigt werden. Beim Testen hat dieser Screen keine Funktion.<\/li>\n<li>Den <em>Einstelllungen<\/em> Screen zum Aktivierung von Benachrichtigungen, globale Einstellungen, die auch beim Testen verwendet werden. Die globalen Einstellungen werden als Default auch im Orte Screen \u00fcbernommen. Ganz wichtig ist noch die Funktion Debugging bei der Testrequests generiert und verschickt werden.<\/li>\n<li>Last but not least den Info Screen, dessen wichtigste Funktion die Diagnose mit Logging ist.<\/li>\n<\/ul>\n<h4>Geofence<\/h4>\n<figure id=\"attachment_1755\" aria-describedby=\"caption-attachment-1755\" style=\"width: 604px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-1755 size-large\" src=\"https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2022\/09\/IMG_1801-768x1024.png\" alt=\"\" width=\"604\" height=\"805\" srcset=\"https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2022\/09\/IMG_1801-768x1024.png 768w, https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2022\/09\/IMG_1801-225x300.png 225w, https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2022\/09\/IMG_1801-1152x1536.png 1152w, https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2022\/09\/IMG_1801.png 1536w\" sizes=\"auto, (max-width: 604px) 100vw, 604px\" \/><figcaption id=\"caption-attachment-1755\" class=\"wp-caption-text\">Geofence Screen<\/figcaption><\/figure>\n<p>Das setzen des Bereichs-Mittelpunktes erfolgt unter \"Orte\" \u00fcber die Eingabe der Adresse. Nachteilig: Will man einen Punkt im freien Gel\u00e4nde setzen, muss man sich dort vor Ort befinden und \"Benutze den aktuellen Standort\" ausw\u00e4hlen.<\/p>\n<p>Der Umfang des \"Zauns\" kann von 50m bis 226km eingestellt werden.<\/p>\n<p>Die Location ID kann frei vergeben werden oder man l\u00e4sst Locative eine ID vergeben<\/p>\n<h4>Webhook<\/h4>\n<p>Ein Webhook ist nichts Anderes als die Empf\u00e4ngeradresse mit einem entsprechenden Programm, dass die von Locative \u00fcbertragenen Daten empf\u00e4ngt, weiterverarbeitet und ggf. darauf antwortet. Zum Experimentieren reicht es v\u00f6llig, sich innerhalb des eigenen privaten Netzwerks zu bewegen. Im Echtbetrieb w\u00fcrde hier nat\u00fcrlich eine aus dem Internet erreichbare URL stehen.<\/p>\n<p>Es gibt zwei verschiedene Trigger-Zust\u00e4nde, n\u00e4mlich \"enter\" und \"exit\" also Ankunft und Verlassen des Geofences.<\/p>\n<h4>GET\/POST<\/h4>\n<p>Es gibt zwei verschiedene Arten, die Daten an den Empf\u00e4nger zu \u00fcbertragen: GET und POST. GET ist etwas einfacher aber unsicher, POST ist etwas komplizierter aber leistungsf\u00e4higer und sicherer. Dazu nachher mehr.<\/p>\n<h3>Testrequest<\/h3>\n<p>Da ja wohl kaum jemand dauernd physisch den Geofence \u00fcberschreiten m\u00f6chte, um die Funktion zu testen, gibt es netterweise die M\u00f6glichkeit, einen \"Ankunft\"-Testrequest auszul\u00f6sen. Der Testreqest befindet sich auf dem Tab \"Einstellungen\".<\/p>\n<p><a href=\"https:\/\/www.rustimation.eu\/index.php\/geofencing-experimente-mit-der-locative-app-teil-1\/img_1805\/\" rel=\"attachment wp-att-1759\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-1759\" src=\"https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2022\/09\/IMG_1805-768x1024.png\" alt=\"\" width=\"604\" height=\"805\" srcset=\"https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2022\/09\/IMG_1805-768x1024.png 768w, https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2022\/09\/IMG_1805-225x300.png 225w, https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2022\/09\/IMG_1805-1152x1536.png 1152w, https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2022\/09\/IMG_1805.png 1536w\" sizes=\"auto, (max-width: 604px) 100vw, 604px\" \/><\/a><\/p>\n<p>Es empfiehlt sich, alle 3 Benachrichtigungsschalter zu aktivieren.<\/p>\n<p>Die URL bei \"Globale HTTP Einstellungen\" muss unbedingt eingetragen werden, es werden keine Werte aus dem Geofence Screen \u00fcbernommen. Wichtig ist auch, vor die URL ein http:\/\/ oder https:\/\/ zu schreiben, sonst funktioniert der Aufruf nicht.<\/p>\n<p>Je nach Serveranwendung\u00a0 muss hier ein GET oder POST gew\u00e4hlt werden. Siehe auch weiter unten.<\/p>\n<p>Die Parameter des Requests sind bei <a href=\"https:\/\/github.com\/LocativeHQ\/Quickstart\/blob\/master\/Webhook%20JSON%20Payload.md\" target=\"_blank\" rel=\"noopener\">Github dokumentiert<\/a>.<\/p>\n<p>F\u00fcr wenig Geld gibt es auch die Professional Version, welche u.a. das Schreiben eigener Request Records erm\u00f6glicht (Request Designer) und ferner eine bessere Auswertung der Geofencing Aktionen erlaubt. Hier geht es aber um die kostenfreie Version der Locative App.<\/p>\n<h4>HTTP Basic Authentifizierung<\/h4>\n<p>Will man die Anwendung produktiv aus dem Internet betreiben, sollte unbedingt eine Authentifizierung vorgenommen werden. Sonst k\u00f6nnte jeder, der die URL kennt, das Licht ein- oder ausschalten oder schlimmeres anrichten. Mehr dazu weiter unter Absicherung. F\u00fcr unsere ersten Experimente innerhalb des eigenen Netwerks brauchen wir ers einmal keine Authentifizierung.<\/p>\n<h4>Request Designer<\/h4>\n<p>Hat bei der kostenlosen Version keine Relevanz. F\u00fcr uns gen\u00fcgt der Standardrequest, der den Absender, die verwendete Hardware, den Zeitstempel, die aktuellen L\u00e4ngen- und Breitengrade sowie die Richtung (rein oder raus) \u00fcbermittelt.<\/p>\n<h4>Protokoll<\/h4>\n<p>Es erleichtert das Verst\u00e4ndnis ungemein, wenn man unter dem Info Tab, die Protokollfunktion einschaltet. Schaltet man das Protokoll wieder aus, wird es dabei gel\u00f6scht.<a href=\"https:\/\/www.rustimation.eu\/img_1802\/\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-1757\" src=\"https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2022\/09\/IMG_1802-768x1024.png\" alt=\"\" width=\"604\" height=\"805\" srcset=\"https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2022\/09\/IMG_1802-768x1024.png 768w, https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2022\/09\/IMG_1802-225x300.png 225w, https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2022\/09\/IMG_1802-1152x1536.png 1152w, https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2022\/09\/IMG_1802.png 1536w\" sizes=\"auto, (max-width: 604px) 100vw, 604px\" \/><\/a><\/p>\n<h3>Manuelles Ausl\u00f6sen<\/h3>\n<p>Hat man sp\u00e4ter einmal eine Anwendung beisammen, kann man die Events \"enter\" und \"exit\" auch von Hand ausl\u00f6sen indem man im Orte Tab etwas l\u00e4nger auf den gew\u00fcnschten Ort tippt. Anschlie\u00dfend kann man \"Ankunft\" oder \"Verlassen\" ausw\u00e4hlen, um die gew\u00fcnschte Routine zu starten, ohne dass eine virtuelle Grenze \u00fcberschritten wird.<\/p>\n<p><a href=\"https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2024\/09\/IMG_9650.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-2935 size-large\" src=\"https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2024\/09\/IMG_9650-576x1024.png\" alt=\"\" width=\"576\" height=\"1024\" srcset=\"https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2024\/09\/IMG_9650-576x1024.png 576w, https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2024\/09\/IMG_9650-169x300.png 169w, https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2024\/09\/IMG_9650.png 750w\" sizes=\"auto, (max-width: 576px) 100vw, 576px\" \/><\/a><\/p>\n<h2>PHP Teststub mit GET<\/h2>\n<p>F\u00fcr einfachste Anwendungen ohne jeglichen Sicherheitsanspruch kann der GET Request genutzt werden. Ich rate in Bezug auf Geofencing davon ab. Wer mehr \u00fcber POST und GET sowie andere Methoden lernen will, dem seien die englischen <a href=\"https:\/\/www.w3schools.com\/tags\/ref_httpmethods.asp\" target=\"_blank\" rel=\"noopener\">W3Schools Seiten zum Thema<\/a> empfohlen.<\/p>\n<p>Beim GET Request werden die Anfrageparameter im Klartext an die aufgerufene URL angeh\u00e4ngt. Das sieht dann z.B. so aus:<span class=\"lang:php decode:true crayon-inline\">\/test\/demo_form.php?name1=value1&amp;name2=value2<\/span><\/p>\n<p>Hier der Teststub dazu:<\/p>\n<pre class=\"lang:php decode:true\" title=\"Teststub mit GET\">&lt;?php\r\n    echo \"l\u00e4uft mit GET! \";\r\n    \/\/ collect value of input field\r\n    $value = $_GET['trigger'];\r\n    if (empty($value)) {\r\n        echo \"Value field is empty\";} \r\n    else {\r\n        echo \"Trigger was \" . $value;\r\n        $datei = fopen(\"record.dat\",\"w\");\r\n        fwrite($datei, $value);\r\n        fclose($datei);\r\n    }\r\n?&gt;<\/pre>\n<p style=\"padding-left: 40px;\"><span style=\"color: #808080;\">Ein Stub ist ein Stummel oder Stumpf. Ein kleines Progr\u00e4mmchen, das ein Interface darstellt, das funktioniert, aber noch erweitert werden muss, um richtigen Nutzen zu stiften.<\/span><\/p>\n<p>Damit GET funktioniert, muss beim Locative Testrequest noch der Schalter \"<em>Body als URL-Query senden, wenn GET-Methode benutzt wird<\/em>\" aktiviert werden.<\/p>\n<p>Es passiert nicht viel: Der Trigger des Requests wird ausgewertet (hier immer \"enter\") , in eine Datei record.dat geschrieben und au\u00dferdem werden mit <span class=\"lang:python decode:true crayon-inline \">echo<\/span>\u00a0Meldungen an die Locative App zur\u00fcckgegeben.<\/p>\n<p>Im Benachrichtigungen Screen erscheint beim Testrequest keine Mitteilung, das erfolgt erst, wenn \"richtige \" Requests verarbeitet werden.<\/p>\n<p><a href=\"https:\/\/www.rustimation.eu\/img_1809\/\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-1765\" src=\"https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2022\/09\/IMG_1809-e1662897284894-1024x849.png\" alt=\"\" width=\"604\" height=\"501\" srcset=\"https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2022\/09\/IMG_1809-e1662897284894-1024x849.png 1024w, https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2022\/09\/IMG_1809-e1662897284894-300x249.png 300w, https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2022\/09\/IMG_1809-e1662897284894-768x637.png 768w, https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2022\/09\/IMG_1809-e1662897284894.png 1536w\" sizes=\"auto, (max-width: 604px) 100vw, 604px\" \/><\/a><\/p>\n<h2>PHP Teststub mit POST<\/h2>\n<p>F\u00fcr die POST Methode habe ich folgenden Code geschrieben:<\/p>\n<pre class=\"lang:php decode:true\" title=\"POST_hook.php\">&lt;?php\r\n\/\/debug setting\r\nerror_reporting (E_ALL | E_STRICT);\r\nini_set ('display_errors' , 1);\r\n\/\/ Ende Debug\r\n\r\necho \"l\u00e4uft mit POST \";\r\n\/\/ collect value of input field\r\n$request = file_get_contents('php:\/\/input');\r\n$value = $_POST['trigger'];\r\n$fp = file_put_contents( 'request.log', $request );\r\necho \"Trigger was \" . $value;\r\n?&gt;<\/pre>\n<p>Anders als vorhin wird der komplette Request in die Datei request.log geschrieben.<\/p>\n<p>Der Debug Teil oben im Code ist hilfreich, wenn man einen Fehler einprogrammiert hat. PHP ist unheimlich empfindlich. Die Fehlermeldung wird im Locative Meldungsfenster ausgegeben. Manchmal ist es auch hilfreich, das Programm direkt im Terminal\u00a0 mit <span class=\"lang:php decode:true crayon-inline \">php nameDesProgramms.php<\/span>\u00a0 aufzurufen. Solange kein Input erwartet wird, sieht man sehr sch\u00f6n, welche Fehlermeldungen ausgegeben werden.<\/p>\n<p>Das w\u00e4re es schon gewesen. Der Trigger ist \u00fcbertragen, gelesen und kann jetzt in einer eigenen Anwendung verarbeitet werden. Denkbar w\u00e4re z.B. ein Skript in Python, das die Datei regelm\u00e4\u00dfig abgreift und daraus irgendwelche Aktionen ableitet.<\/p>\n<p>Ist das Ganze auf einem Minirechner zuhause installiert (z.B. einem Raspberry Pi) und ist dieser Rechner bzw. der Webserver aus dem Internet erreichbar, hat man aber ein gr\u00f6\u00dferes Sicherheitsproblem. Also&#8230;<\/p>\n<h3>Absichern<\/h3>\n<p>Wie oben erw\u00e4hnt, beherrscht Locative die http Basic Authorization. Das hat \u00fcbrigens nichts mit einem passwortgesch\u00fctzten Verzeichnis zu tun. So etwas ist eher f\u00fcr browserbasierte Anwendungen gedacht. Locative wird damit nicht\u00a0 funktionieren.<\/p>\n<p>Die Basic Authorization &#8211; zumindest so wie ich sie verstanden habe &#8211; transportiert Username und Passwort in gehashter Form im Header des Requests. Der Header muss vom Empf\u00e4nger dementsprechend analysiert, die Informationen ausgelesen und decodiert und anschlie\u00dfend mit den hinterlegten Credentials verglichen werden. Erst wenn das erfolgt ist, kann weitergearbeitet werden.<\/p>\n<p>PHP ist f\u00fcr Laien wie mich nicht ganz einfach, weshalb ich mir verschiedene Code Snippets im Internet zusammengesucht habe, um eine funktionierende Anwendung zu bauen.<br \/>\nSehr hilfreich war der Artikel <a href=\"https:\/\/www.codepunker.com\/blog\/php-a-primer-on-the-basic-authorization-header\" target=\"_blank\" rel=\"noopener\"><em>PHP A primer on the basic authorization header<\/em><\/a>, von dem ich den ersten Codeschnipsel zum Auslesen von Username und Passwort verwendet habe.<br \/>\nFerner der Artikel <a href=\"https:\/\/www.geeksforgeeks.org\/how-to-encrypt-and-decrypt-passwords-using-php\/\" target=\"_blank\" rel=\"noopener\"><em>How to encrypt and decrypt passwords using PHP ?<\/em><\/a> in dem die Behandlung der beim Server hinterlegten Credentials sehr gut beschrieben ist.<\/p>\n<p>Aus grunds\u00e4tzlichen \u00dcberlegungen heraus habe ich bewusst kein Framework wie z.B. <em>Symfonie<\/em> verwendet.<\/p>\n<p>Unseren Stub POST_hook.php habe ich wie folgt erweitert (die hervorgehobenen Teile sind aus dem alten Code \u00fcbernommen):<\/p>\n<pre class=\"lang:php mark:2-5,23-26 decode:true\" title=\"auth_POST_hook.php\">&lt;?php\r\n    \/\/debug setting\r\n    error_reporting (E_ALL | E_STRICT);\r\n    ini_set ('display_errors' , 1);\r\n    \/\/ Ende Debug\r\n\r\n    \/\/check if exists basic auth in request\r\n    if (isset($_SERVER[\"HTTP_AUTHORIZATION\"])) {\r\n        $auth = $_SERVER[\"HTTP_AUTHORIZATION\"];\r\n        $auth_array = explode(\" \", $auth);\r\n        $un_pw = explode(':', base64_decode($auth_array[1]));\r\n        $un = $un_pw[0];\r\n        $pw = $un_pw[1];\r\n    \r\n        \/\/ check Uname &amp; PW    \r\n        $fh = file_get_contents('.password\/pwds.env');\r\n        $pline = explode(':', $fh);\r\n        $encpw = preg_replace('\/\\s+\/', '', $pline[1]);\r\n        $verify = password_verify($pw, $encpw);\r\n        \r\n        \/\/ if password is correct, continue\r\n        if ($un == $pline[0] &amp;&amp; $verify) {\r\n            \/\/receiving part\r\n            $request = file_get_contents('php:\/\/input');\r\n            \/\/$req_dump = print_r( $request, true );\r\n            $fp = file_put_contents( 'request.log', $request );}\r\n       \r\n        else {\r\n            echo \"UNAUTHORIZED!!!!!\";}\r\n    }\r\n    else {\r\n        echo \"Missing credentials\";}    \r\n        \r\n?&gt;        \r\n<\/pre>\n<p>In Zeile 18 wird mit <span class=\"lang:php decode:true crayon-inline \">preg_replace<\/span>\u00a0 der aus der Datei \u00fcbernommene Passworteintrag noch ges\u00e4ubert, sonst wird noch ein Steuerzeichen (Zeilenende) mit ausgelesen, was den Vergleich fehlschlagen l\u00e4sst.<\/p>\n<p>Die Passwortdatei befindet sich in einem versteckten Verzeichnis &#8211; das erzeugst du im Linux Terminal, indem du es im Verzeichnis des PHP Skripts mit <span class=\"lang:python decode:true crayon-inline\">sudo mkdir .passwords<\/span>\u00a0 anlegst.<\/p>\n<p>Das Passwort wird mit PHP verschl\u00fcsselt. Hierzu folgende Routine anpassen, als hash.php speichern und mit <span class=\"lang:python decode:true crayon-inline \">php hash.php<\/span>\u00a0 starten.<\/p>\n<pre class=\"lang:php decode:true\">&lt;?php\r\n   \/\/ The plain text password to be hashed\r\n  $plaintext_password = \"deinSupergeheimesBasicAuthPasswort\";\r\n  \r\n  \/\/ The hash of the password that\r\n  \/\/ can be stored in the database\r\n  $hash = password_hash($plaintext_password, \r\n          PASSWORD_DEFAULT);\r\n  \r\n  \/\/ Print the generated hash\r\n  echo \"Generated hash: \".$hash;\r\n?&gt;<\/pre>\n<p>Das Programm gibt dein Passwort in verschl\u00fcsselter Form aus &#8211; ich meine, das Sicherheitsniveau reicht f\u00fcr unsere Zwecke.<\/p>\n<p>Das Passwort und den Usernamen packst du wie folgt in die Datei pwds.env als eine einzige Zeile. Da wir es ja mit einem einzigen Maschinenuser (z.B. \"locative\") zu tun haben, brauchen wir keine User- und Passwortverwaltung. Vorne der username dann ein Doppelpunkt und dann das verschl\u00fcsselte Passwort mit der L\u00e4nge 60.<\/p>\n<p><span class=\"lang:php decode:true crayon-inline \">locative:$2y$10$zz1KkB0Ieo\/Pb5lL51\/oyuTF2KBLiON2t0c7pBAUtGZJOVm42lV06<\/span><\/p>\n<p>Im Verzeichnis <span class=\"lang:python decode:true crayon-inline \">.passwords<\/span>\u00a0 abspeichern und fertig.<\/p>\n<p>Noch sicherer wird es, wenn du deinen Webserver mit SSL bzw. https: absicherst. Dann aber aufpassen, dass die URLs in Locative entsprechend angepasst werden.<\/p>\n<p>Wie gesagt, du kannst den Output beliebig weiterverwenden und mit selbst entwickelten Routinen verarbeiten. Zum Beispiel GPIO Pins im Raspberry Pi ansteuern oder Shellies schalten oder wie ich Node-Red damit verk\u00fcpfen. Dazu mehr <a href=\"https:\/\/www.rustimation.eu\/index.php\/geofencing-experimente-mit-der-locative-app-teil-2\/\">im Teil 2.<\/a><\/p>\n<p><strong>Achtung Apache:<\/strong> Im Zuge eines Komplett-Updates meines Servers bin ich auf Apache2 als Webserver umgestiegen &#8211; vorher hatte ich lighttpd verwendet.\u00a0 Apache2 hat aus irgend welchen Gr\u00fcnden die Autorisierung \u00fcber den html Header deaktiviert. <span class=\"lang:python decode:true crayon-inline \">$_SERVER[\"HTTP_AUTHORIZATION\"]<\/span> funktioniert also von Haus aus\u00a0 nicht.<\/p>\n<p>Abhilfe erfolgt durch den Eintrag <span class=\"lang:python decode:true crayon-inline \">CGIPassAuth On<\/span> in der Datei <span class=\"lang:python decode:true crayon-inline \">.htaccess<\/span>\u00a0 im Verzeichnis unseres PHP Programms.<\/p>\n<p>Eventuell muss .htaccess auch noch aktiviert werden: Dazu die Datei <span class=\"lang:python decode:true crayon-inline\">\/etc\/apache2\/apache2.conf<\/span> editieren und bei\u00a0 bereits vorhandenen Eintr\u00e4gen der Art<\/p>\n<pre class=\"lang:php decode:true\">&lt;Directory \/var\/www\/&gt;\r\n        Options Indexes FollowSymLinks\r\n        AllowOverride None\r\n        Require all granted\r\n&lt;\/Directory&gt;<\/pre>\n<p>folgenden Eintrag hinzuf\u00fcgen:<\/p>\n<pre class=\"lang:python mark:3 decode:true \">&lt;Directory \/var\/www\/html&gt;\r\n        Options Indexes FollowSymLinks\r\n        AllowOverride All\r\n        Require all granted\r\n&lt;\/Directory&gt;<\/pre>\n<p>Anschlie\u00dfend den Webserver mit <span class=\"lang:php decode:true crayon-inline \">sudo service apache2 restart<\/span> neu starten.<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Nach sehr langer Pause hat mich wieder einmal die Lust am Basteln und Experimentieren gepackt&#8230; Also, auf geht's: Was ist Geofencing? Im Zuge des Vormarschs von Internet of Things (IoT) Produkten kommt vermehrt auch Geofencing zum Einsatz. Geofencing ist ein Kunstwort, zusammengesetzt aus den Begriffen \"Geo\" (Erde oder auch abgek\u00fcrzt f\u00fcr Geographie etc.) und \"Fence\" &hellip; <a href=\"https:\/\/www.rustimation.eu\/index.php\/geofencing-experimente-mit-der-locative-app-teil-1\/\" class=\"more-link\"><span class=\"screen-reader-text\">Geofencing Experimente mit der Locative App <br \/> Teil 1: PHP<\/span> weiterlesen <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[150,53,8,10],"tags":[155,154,152,67,153,55,156],"class_list":["post-1742","post","type-post","status-publish","format-standard","hentry","category-geofencing","category-iot","category-php","category-raspberry-pi","tag-basic-auth","tag-get","tag-locative-app","tag-php","tag-post","tag-programmieren","tag-webhook"],"_links":{"self":[{"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/posts\/1742","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/comments?post=1742"}],"version-history":[{"count":1,"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/posts\/1742\/revisions"}],"predecessor-version":[{"id":2938,"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/posts\/1742\/revisions\/2938"}],"wp:attachment":[{"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/media?parent=1742"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/categories?post=1742"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/tags?post=1742"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}