WebOAuth2 mit Webhook

Hallo,

ich schreibe gerade ein Modul um, da der Hersteller (nello.io) nun eine API anbietet mit WebOAuth2 und die Möglichkeit Informationen über einen Webhook zu senden.

WebOAuth2 ist fertig, habe ich mit Michael (paresy) eingerichtet und der Bearer Token wird abgeholt. Das funktioniert schonmal.

Jetzt habe ich die Möglichkeit mit PUT einen Webhook zu erstellen, soweit auch klar.

Was habe ich bis jetzt genacht:

In meinem Modul über die Methode RegisterHook($WebHook) die Instanz an die WebHook Instanz (Kern-Instanz) registriert.

Über ProcessHookData() in meinem Modul würde ich die ankommenden Date auswerten.

Wie kann ich jetzt dem Hersteller die ipmagic Adresse mitteilen? Geht das automatisiert, oder muss ich ein Konfigurtionsfeld zur manuellen Eingabe erstellen?

Oder ist die Vorgehensweise eine andere?

Habe mir schon andere Module angesehen, geofency, fitbit… werde aber noch nicht schlau daraus.:confused:

Uli

Schau hier:
IPSOpCache/module.php at 292085d00068518d99ecb1f5ba9c454c0a5468c0 · Nall-chan/IPSOpCache · GitHub

Habe mich mit OAuth noch nicht beschäftigt; aber ist nach der Registrierung dem Dienst nicht das Ziel (ipmagic) bekannt?
Michael

Hallo Michael,

wie immer ist auf dich verlass :slight_smile:

Danke für den link, schaue ich mir gleich an.

Ich muss für den Webhook die URL nochmal angeben:

curl_setopt($ch, CURLOPT_POSTFIELDS, "{
  \"url\": \"[b]http://example.com/path-to-webhook\[/b]",
  \"actions\": [
    \"swipe\",
    \"geo\",
    \"tw\",
    \"deny\"
  ]
}");

https://nellopublicapi.docs.apiary.io/#reference/0/locations-collection/add-/-update-webhook

Erstmal Danke, vielleicht bis später :smiley:

für Oauth ja, aber nicht für den WebHook

Nein Du musst nichts erstellen. Das Aushandeln über OAuth macht der Oauth Server des Herstellers und der OAuth Endpunkt von IP-Symcon. Dem Hersteller ist auch die ipmagic Adresse nicht bekannt, diese bekommt dieser auch niemals mit. Der Hersteller kennt nur IP-Symcon als zertifizierter OAuth Client und den OAuth Server von IP-Symcon. Du identifizierst Dich über den Bearer Token, den Du wiederum vom IP-Symcon Server gesendet bekommst, den Bearer holt der Symon Server für Dich beim Hersteller ab und leitet den an Dich weiter. Die ipmagic Adresse kennt außschließlich Symcon. Wenn also Daten vom Hersteller kommen laufen diese über den Symcon Server und werden dann an das spezielle Symcon System durchgereicht.

Wie die Vorgehensweise genau ist hängt auch davon ab ob Symcon der OAuth Server oder ein Oauth Client darstellt. Dazu müsstest Du vielleicht noch etwas mehr Infos liefern dann kann man Dir auch helfen. Ich nehme eher an Du musst Dich mit dem Bearer authentifizieren und forderst dann Daten von einer Schnittstele der Herstellers an oder?

Äh… Aber der Hersteller muss es doch an den Symcon OAuth Endpunkt senden und nicht an den (per Default nicht gesichert) Webhook einer IPS Installation.
Michael

Komisch, dass ich wusste, wer der nächste ist der schreibt:D

Also WebOAuth funktioniert und danke für deine Erläuterungen.

Mir geht es jetzt um den Webhook, um Informationen vom nello device zu erhalten.

Beispiel: Es klingelt jemand an der Tür. Nello merkt das und schickt über einen zuvor registrierten Webhook die Infomrationen, die ich dann auswerte.

Ich muss diesen Webhook zunächst über WebOAuth regisitrieren. Das ist mir auch klar wie ich das mache.

Ich muss aber bei der Regisitrierung:

{
  "url": "http://example.com/path-to-webhook",
  "actions": [
    "swipe",
    "geo",
    "tw",
    "deny"
  ]
}

eine URL angeben. Welche nehme ich da?

Die URL sollte eigentlich festgelegt worden sein beim OAuth Process, diese ist also fest, da must Du Dich nicht drum kümmern denn die URL ist ja nicht dein Symcon System sondern auf dem IP-Symcon Oauth Server. Du hast einen oauthIdentifer von Symcon, diesen musst Du nutzten. Damit sagst Du dann dem Symcon Server das alles was dort ankommt eben an das IP-Symcon System durchgereicht werden soll. Dazu registrierst Du im Create Teil
mit


$this->RegisterOAuth($this->oauthIdentifer);

@fonzo:

Was gebe ich denn dann da für eine URL an:

{
  "url": "http://example.com/path-to-webhook",
  "actions": [
    "swipe",
    "geo",
    "tw",
    "deny"
  ]
}

Um den Webhook zu regisitrieren mache ich das über WebOAuth, die wollen aber im body noch die „url“ haben?!!?

Denn dort kann ich auch sagen, welche Arten von Informationen ich erhalten will.

Trage ich da https://oauth.ipmagic.de/forward/nello ein?!?!?!

Da sollte die Redirekt URL rein, die festgelegt worden ist, also wie Du sagst in dem Fall


https://oauth.ipmagic.de/forward/nello

Allerdings musst Du diese Daten ja nicht jedes mal festlegen. Diese Daten sind fest beim Hersteller hinterlegt, dieser schickt alles immer an dem Symcon Server. Du bekommst alle Daten dann vom Symcon Server über IP-Symcon Connect.

Ich probiere das mal aus, mal gucken, wie weit ich komme.

Vielleicht liest @paresy ja noch mit und bestätigt das.

Vielen Dank Euch beiden !

Uli

Ist den Symcon der OAuth Client oder der OAuth Server?

So den Webhook habe ich jetzt registriert und wurde erfolgreich angelegt:

22.06.2018, 22:07:57 | Nello One Webhook:  | {"result": {"code": 200, "success": true, "message": "Webhook was modified successfully."}, "data": {}}

Wenn ich jetzt an meine Türklingel betätige, tut sich leider nix.

Irgendetwas stimmt da noch nicht… ich schlafe mal eine Nacht darüber.

Guten Morgen,

habe gestern noch auf den „normalen“ Webhook umgestellt. D.h. ich habe meine ipmagic adresse mit /hook/nello angegeben.

Da schein jetzt auch etwas anzukommen:


22.06.2018, 22:49:26 |         SERVER ARRAY | Array
(
    [REQUEST_URI] => /hook/nello/
    [REMOTE_ADDR] => 127.0.0.1
    [HOOK] => /hook/nello
    [REQUEST_METHOD] => PUT
    [PHP_AUTH_USER] => 
    [QUERY_STRING] => 
    [HTTP_USER_AGENT] => python-requests/2.18.4
    [SERVER_PROTOCOL] => HTTP/1.0
    [HTTP_CONTENT_LENGTH] => 83
    [HTTP_X_FORWARDED_FOR] => 18.194.130.14
    [HTTP_ACCEPT_ENCODING] => gzip, deflate
    [DOCUMENT_ROOT] => /Applications/Symcon.app/Contents/Service/webfront
    [HTTP_HOST] => 127.0.0.1:18033
    [SCRIPT_NAME] => /hook/nello/
    [PHP_AUTH_PW] => 
    [HTTP_CONNECTION] => close
    [HTTP_ACCEPT] => */*
    [HTTP_CONTENT_TYPE] => application/json
    [PHP_SELF] => /hook/nello/
    [REQUEST_TIME_FLOAT] => 1529700566,5129
    [REQUEST_TIME] => 1529700566
    [argv] => Array
        (
        )

    [argc] => 0
)

Zwei Fragen:

  1. Wie komme ich an die Daten, da steht ja keine Info was passiert ist, z.B. (Es wurde an der Tür geklingelt)?
  2. Die senden das als PUT, legen die da ein File ab?

Bisher habe ich in meinem ProcessHookData folgendes:


protected function ProcessHookData()
    {

        $this->SendDebug("SERVER ARRAY",print_r($_SERVER,true),0);

        $this->SendDebug("Nello POST:", json_encode($_POST), 0);
        $this->SendDebug("Nello GET:", json_encode($_GET), 0);

        return true;
}

$_PUT gibt es ja nicht?!?!

Freue mich über einen Hinweis.

Uli

Doku lesen :wink:
Beispiel Zeile 4:
WebHook Control — IP-Symcon :: Automatisierungssoftware
Michael

Danke Michael, hatte ich gerade selber gefunden, du warst mal wieder schneller, schläfst du auch mal?:wink:

$data = file_get_contents(‚php://input‘);

Daten sind also somit da und kann ich dann weiterverarbeiten:


{"action": "deny", "data": {"location_id": "123456-7891011-1234-1234-0az32642457z"}}

Bleibt jetzt nur eine abschließende Frage:

  1. Webhook über die WebOAuth Instanz?
  2. Oder separater WebHook, nach klassischem Schema?

Erwarte nicht unbedingt eine Antwort!

Wahrscheinlich willst du den WebHook verwenden - es sei denn die Nello API nutzt die selben OAuth Tokens auch für die Hooks - dann kannst du es natürlich auch über den OAuthHook machen (was sicherer wäre).

paresy