Twilio?

Twilio ist ein Anbieter einer Cloud-Kommunikationsplattform. Das Unternehmen stellt Messaging, Voice und Video Funktionen bereit, zum Beispiel Versand und Empfang von SMS und das Initiieren und Annehmen von Telefonanrufen.

Für ausgehende Aktionen stellt Twilio eine webbasierte API bereit, eingehende Anrufe und SMS werden als HTTP-Requests an das Kundensystem - also z.B an unseren Server - weitergeleitet. Bei SMS führt die Rückgabe eines Textes zu einer Antwort-SMS, bei Anrufen gibt man ein spezielles XML-Dokument, das dann eine Sprachausgabe oder andere Aktionen bewirkt.

Projekt-Idee

inhaltl. Voraussetzungen

Ein Account bei Twilio ist natürlich hilfreich ;) Die Registrierung ist kostenlos, man bezahlt dann für jede angemietete Rufnummer sowie pro ein- und ausgehender Aktion. Zudem benötigt man den Auth Token aus den Account Daten.

techn. Voraussetzungen

Der Servlet Filter setzt Java 7 und einen Applikationsserver mit Servlet API 3 voraus.

Voraussetzungen

Validierung eingehender Requests

Für eingehende SMS oder Anrufe machen die Systeme von Twilio jeweils HTTP-Requests an eine konfigurierbare URL auf dem Kundensystem (also z.B. auf unseren Server). Dabei werden alle relevanten Informationen wie Anrufer-Nummer, Zeitpunkt, Aktion oder ähnliches übertragen.

Zwar kann man die Übertragung via SSL (selbstsignierte Zertifikate werden nicht unterstützt!) absichern, aber in der Konfiguration wird "nur" eine URL für die Rufnummer konfiguriert, auf die dann ein POST- oder GET-Request geschickt wird.

Diese URL ist quasi öffentlich zugäglich (wenn man sie kennt), weshalb auch der Aufruf durch Unbefugte stattfinden könnte.

Um dies ein wenig sicherer zu machen, signiert Twilio jeden Request in einem HTTP Header. Dafür wird der (geheime) Auth Token genutzt, den man in der Account Konfiguration findet.

Das Projekt

Konfiguration

Der Servlet Filter wird in der eigenen Web-Applikation als Filter in der web.xml eingebunden. Nachfolgend ein Beispiel:

<filter>
    <filter-name>twilioauth</filter-name>
    <filter-class>com.github.nilscoding.twilio.validatereq.RequestValidationFilter</filter-class>
    <init-param>
        <param-name>authToken</param-name>
        <param-value>your-auth-token</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>twilioauth</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
                                

Konfiguration

Wichtige Anmerkungen

Da der Auth Token im Klartext in der web.xml hinterlegt werden muss, solltet Ihr sicherstellen, dass der Zugriff auf diese Datei auf dem Server eingeschränkt wird. Zudem sollte der Auth Token entfernt werden, bevor Ihr eine Applikation weitergebt oder z.B. bei GitHub veröffentlicht.

Wenn die Signatur nicht validiert werden kann, erzeugt der Servlet Filter eine HTTP-Response 403. Ihr solltet also für Eure Web-Applikation eine entsprechende Fehlerseite konfigurieren. Falls ein anderes Verhalten benötigt wird, kann der Filter abgeleitet und die Methode denyAccess(...) überschrieben werden.

Der Filter funktioniert derzeit nur für POST Requests. Aus diversen Gründen (z.B. Datenschutz in den Log-Dateien) sollten die URLs für Requests seitens Twilio am besten immer als HTTP POST konfiguriert werden.

Optionale Features

Optional kann in der Filter-Konfiguration auch noch ein Wert für removeUrlPart angegeben werden. Diese Zeichenkette wird dann beim Prüfen aus der URL entfernt. Dies kann hilfreich sein, wenn die Web-Applikation hinter einem Apache Webserver betrieben wird, der die Anfragen per Proxy weiterleitet, da in diesem Fall im Tomcat eine Zeichenkette (Applikationsname) in der URL auftauchen kann, die von extern nicht sichtbar ist und deshalb von Twilio auch nicht bei der Signierung berücksichtigt werden kann.
(Das ist aber ein ganz anderes Thema und vielleicht Inhalt eines zukünftigen Eintrags...)

Hinweise

Disclaimer

Sowohl der Quellcode als auch die Informationen in diesem Text sind sorgfältig zusammengestellt und getestet worden. Trotzdem sind Fehler nicht auszuschliessen. In diesem Fall bitte gerne einen Issue auf GitHub zum Projekt erstellen. Danke.

Bitte beachtet unbedingt die Anmerkungen oben und prüft lieber doppelt, ob Ihr vor der Weitergabe oder Veröffentlichung eines Projektes nicht doch irgendwo Euren Auth Token drin stehen habt.

Zusatzinfos
Navigation