Nachrichtenempfang mit der Python-API?

Stelle deine Frage öffentlich an die Threema-Forum-Community - über 4.600 Mitglieder helfen dir weiter. > Frage stellen <
  • Hallo zusammen!

    Ich habe mal den Threema Gateway ausprobiert und kann per Python-API Nachrichten verschicken. In der Readme der API steht folgendes (Hervorhebung von mir):


    Zitat


    threema-gateway is a Python 3 module for the Threema gateway service. This API can be used to send and receive text messages to and from any Threema user.

    Ich finde in der API aber nur Funktionen zum Versand von Nachrichten, nicht zum Empfang. Ich kann in der Konfiguration eine Callback-URL angeben was aber ja bedeutet, dass ich die Empfangsfunktion im Webserver implementieren müsste. Ich dachte dass es vielleicht eine Möglichkeit gibt, mittels Polling auf dem Gateway-Server nach neuen Nachrichten zu schauen und diese dann herunterzuladen. Hat jemand damit Erfahrung?

    Danke und beste Grüße,
    Marek

  • Genau das habe ich gesucht, vielen Dank! Werde ich mir morgen mal genauer anschauen.

    Natürlich meinte ich das SDK, nicht die API - und jetzt sehe ich auch den Grund für die Verwechslung: Der Satz "This API can be used to send and receive text messages..." bezieht sich auf den "gateway service" und nicht das "Python 3 module", wie ich zuerst dachte. Insofern habe ich ja Glück dass das SDK auch beides kann, denn genaugenommen steht das da gar nicht ;)


  • Wenn die anderen SDKs nicht mittlerweile nachgezogen haben, ist der Server bisher auch nur im Python SDK verfügbar.

    Ich glaube nicht. Ich finde es beim PHP-SDK aber relativ leicht zu implementieren. Da macht es auch Sinn, den nicht fertig bereitzustellen, da das Callback ja in die übergeordnete PHP-Anwendung eingebunden werden muss. Die Methoden zur Entschlüsselung & co sind alle da.

  • Es ist vermutlich noch wichtig zu erwähnen, dass der Empfang von Nachrichten nicht über den vom SDK bereitgstellten Server durchgeführt werden muss. Der Callback wird per POST an deine Callback-URL geliefert und kann da mit beliebigem Code entschlüsselt werden.

    Wenn du da einen generischen Request Handler hast, musst du zusammengefasst folgendes durchführen:

    - MAC prüfen (HMAC-SHA256 aus der Python stdlib)
    - Public key des peers fetchen (entweder mit dem SDK, benötigt dann asyncio, oder synchron via urllib oder requests)
    - Nachricht entschlüsseln (geht mit threema.gateway.e2e.decrypt)

    Hier mal etwas Pseudocode:

  • Vielen Dank für die ausführlichen Antworten!

    Sicher kann ich das Callback auch in nginx o.ä. realisieren, aber der Server aus der Python-SDK ist für meine Zwecke schon sehr gut geeignet. Ich finde es auch aus Sicherheitsgründen durchaus sinnvoll, das vom restlichen Webbetrieb getrennt zu halten.

    Muss ich beim Zertifikat/TLS etwas besonderes beachten? Ich benutze momentan ein Zertifikat von LetsEncrypt mit TLS 1.2.


  • Sicher kann ich das Callback auch in nginx o.ä. realisieren, aber der Server aus der Python-SDK ist für meine Zwecke schon sehr gut geeignet. Ich finde es auch aus Sicherheitsgründen durchaus sinnvoll, das vom restlichen Webbetrieb getrennt zu halten.

    Also mit nginx hat das ja mal nichts zu tun. Du kannst allerdings nginx als reverse proxy verwenden um das Callback an das Python-SDK (welches dann ja als Serveranwendung läuft) weiterzuleiten. So kannst du eventuell eine bessere HTTPS-Verbindung realisieren oder den Traffic begrenzen oder so…
    Aus Sicherheitsgründen macht es also sehr wohl Sinn, nginx zu verwenden. Eine "Trennung" in diesem Sinne ist das eher nicht.


    Muss ich beim Zertifikat/TLS etwas besonderes beachten? Ich benutze momentan ein Zertifikat von LetsEncrypt mit TLS 1.2.

    Wie auf der Gateway-Webseite steht: Es muss gültig sein, sonst alles wie normal. Let's Encrypt geht also.

  • nginx funktioniert auch als ganz normaler Webserver. Aber das war auch nur als Beispiel für "irgendein Webserver der PHP-Skripte ausführen kann" gedacht. Feel free to s/nginx/apache.

    Mit dem LetsEncrypt-Zertifikat und dem Callback-Server aus dem Python-SDK bekomme ich folgende Fehlermeldung beim Handshake:

    Code
    ssl.SSLError: [SSL: SSLV3_ALERT_CERTIFICATE_UNKNOWN] sslv3 alert certificate unknown

    Im Browser kann ich die URL problemlos aufrufen, Firefox und Python einigen sich dann auf TLS 1.2.

    Update: Nevermind, hab den Fehler gefunden. Das Zertifikat wurde nicht richtig geladen und der Browser hatte es wohl noch im Cache.

    Einmal editiert, zuletzt von marek (15. Februar 2017 um 11:19)