Beiträge von marco79cgn

    Seid ihr alle Informatiker oder was?

    Ja, bin ich. :P

    Zitat

    Kann man das Ganze in Deutsch für Laien zusammenfassen?

    Ich versuche es:


    Die relevanten Daten, die man haben möchte, liegen „in der Cloud“ und man kann über http-Anfragen darauf zugreifen. Das macht zum Beispiel die App. Allerdings werden Anfragen nur beantwortet, wenn man zum einen angemeldet ist und zusätzlich jede einzelne Anfrage mit einer Prüfsumme versehen ist, die mithilfe eines geheimen Schlüssels berechnet wurde. Ansonsten antwortet der Server in der Cloud lediglich mit „Du kommst hier net rein!“.


    So funktioniert vereinfacht die moderne Kommunikation im Web, auch zwischen deinem Browser und der Gegenstelle. Beim Bestellprozess war das einfacher, da war nicht jede Anfrage nochmal zusätzlich mit einer Signatur versehen, sondern es reichte aus zu beweisen, dass man angemeldet ist.


    War das jetzt verständlicher?

    Die UserID nützt alleine recht wenig. Wie bereits beschrieben, sind alle Anfragen signiert. Ohne gültige Signatur kommt kein Ergebnis.


    Folgende Header werden zwingend benötigt. Wie man an den Authorization Token kommt weiß ich. Beim Timestamp ist es nur wichtig, dass er maximal 30 Sekunden alt ist und neuer als jener vom vorigen Request. Was fehlt ist die Berechnung der Signatur (x-signature) und beim Nonce weiß ich nicht genau, ob man irgendwas schreiben kann. In jedem Fall muss es unique sein.


    Sobald der Timestamp und bzw. oder der nonce geändert wird, stimmt die Signatur nicht mehr und muss neu berechnet werden. Dazu wird ein Secret benötigt, das mir nicht bekannt ist.


    Der Knackpunkt ist also diese Berechnung. Ohne die gibt es kein Home Assistant oder sonstige Anbindungen. Ist natürlich alles non-public, also bekommt man von offizieller Seite keine Info.

    Ich habe mich mal mit einem Proxy zwischen die iOS App gehängt und geschaut, welche api calls gemacht werden und was zurück kommt.


    Vorneweg: die Kommunikation ist per Oauth abgesichert und jeder einzelne Request wird nicht nur mit einem Authorization Header versehen (JWT accessToken) sondern zusätzlich mit einem Timestamp, einer Nonce (Zufallswert) sowie einer Signatur. Die Signatur wird mit einem privaten Schlüssel generiert (der mir nicht bekannt ist). Dadurch wird sichergestellt, dass Requests nicht wiederholt abgeschickt werden können bzw. abgefangen und verändert werden.


    Folgender api call liefert so ziemlich alle Daten, die teilweise auch in der App schon angezeigt werden, z.B. Standort des Autos (position), Reifendruck, Akkustand (chargeLevel) usw. Es sind aber auch Infos dabei, die die App (noch) nicht anzeigt, z.B. der Zustand der 12V Batterie.


    Api Endpunkt:

    https://api.ecloudeu.com/remote-control/vehicle/status/HESXA2C48N*******?latest=False&target=basic%2Cmore&userId=79****

    (→ Im Header des Requests müssen sämtliche Parameter übergeben werden, ansonsten kommt nichts zurück)


    Ergebnis: