Web Service Toolkit für PHP5

Die Seite wird erstellt Stefan Schwab
 
WEITER LESEN
SEMINAR KONZEPTE UND METHODEN DER WEB-PROGRAMMIERUNG 2005/2006                                                                 1

                           Web Service Toolkit für PHP5
                 Stefan Marr, Falko Menge, Gregor Gabrysiak, Martin Sprengel, Michael Perscheid,
                               Christoph Hartmann, Andreas Meyer und Sebastian Böttner
                                     Hasso-Plattner-Institut für Softwaresystemtechnik

   Zusammenfassung— Dieses Paper beschreibt die Ergebnisse         dukte verwendet, die via Web Service in die Anwendungen
unserer Arbeit an einer Sammlung von Werkzeugen für die            integriert werden.
automatisierte Erstellung von Web Services unter PHP5. Die            In unserer ersten Ausarbeitung „Einführung in XML Web
besonderen Eigenschaften der Sprache machen die Entwicklung
von Meta-Spach-Werkzeugen etwas schwierig. Daher wurde die         Services“ [4] haben wir SOAP, WSDL und UDDI vorgestellt
Reflection API von PHP5 erweitert, um die benötigten Infor-        und gezeigt, wie man die Standards mit PHP5 nutzen kann.
mationen über Sprachkonstrukte zu erhalten und Annotationen        PHP5 bietet eine Implementierung des SOAP-Protokolls, die
in PHP5 zu ermöglichen. Auf dieser Basis wurden zunächst           sich nutzen lässt, um interoperable SOAP-Server und -Clients
ein leistungsfähiger WSDL-Generator und ein spezieller Code-       zu entwickeln.
Generator entwickelt. Um eine sichere Authentifizierung für
Nutzer von Web Services zu ermöglichen wurde das Username-            Um eine Klasse in PHP5 als Web Service anzubieten,
Token-Profile aus dem WS-Security-Standard für PHP5 imple-         erstellt man zunächst eine Beschreibung der Schnittstelle mit
mentiert. Dazu wurde der SOAP-Server um einen Handler-             WSDL. Dabei definiert man unter anderem für alle Datentypen
Chain-Mechanismus für SOAP-Intermediaries erweitert. Zusätz-       mit Hilfe von XML Schema-Ausdrücken, wie sie für das
lich zu den Werkzeugen für SOAP-basierte Web Services ent-
                                                                   Versenden in SOAP-Nachrichten serialisiert werden sollen.
stand eine Reihe von Werkzeugen zur Entwicklung von RESTful
Web Services mit PHP5. Ein Administrationstool stellt eine ein-    Eine Dokumentation der Methodensemantik kann manuell aus
heitliche grafische Oberfläche für alle Werkzeuge zur Verfügung,   dem Quelltext der Klasse in die Schnittstellen-Beschreibung
um automatisiert SOAP- und REST-Server für eine bestehende         übertragen werden. Danach schreibt man ein PHP Script, das
Anwendung zu generieren, wodurch eine plattformübergreifende       mit Hilfe der WSDL-Beschreibung einen SOAP Server startet.
Kommunikation mit anderen Anwendungen möglich wird.
                                                                   Dieser erzeugt dann ein Exemplar der dazugehörigen Klasse
  Stichworte— PHP5, Reflection, Annotations, Web Services,         und beginnt SOAP-Anfragen zu beantworten.
WSDL-Generator,      SOAP-Handler-Chains,     WS-Security,            Das ist natürlich bei weitem nicht so komfortabel, wie man
Username-Token-Profile, REST.
                                                                   es von .NET oder der Java Enterprise Edition gewohnt ist.
                                                                   Die SOAP-Implementierung ist zwar sehr einfach zu benutzen,
                       I. E INFÜHRUNG                              jedoch ist die manuelle Erstellung von WSDL-Beschreibungen
                                                                   sehr aufwändig und könnte prinzipiell automatisiert werden.
        EB SERVICES sind eines der wichtigsten IT-Themen
W       der letzten Jahre. Sie bieten interoperable Kommunika-
tion über Plattform- und Programmiersprachengrenzen hinweg
                                                                   Um also professionell in großen Systemen Web Services an-
                                                                   zubieten, benötigt man umfangreiche Werkzeugunterstützung.
                                                                   Typischerweise verwendet man in anderen Programmierspra-
und stellen aus diesem Grund für Unternehmen ein vielver-          chen Annotationsmechanismen um Klassen und Methoden ei-
sprechendes Konzept dar, um bestehende interne und unter-          ner Anwendung zu markieren, die als Web Service verwendet
nehmensübergreifende Anwendungen sinnvoll zu integrieren           werden sollen. Mit dem so markierten Quelltext wird eine
und so Geschäftsprozesse zu optimieren. Das Grundprinzip           Werkzeugkette angestoßen, die dann WSDL-Beschreibungen,
dabei ist, dass Anwendungen ihre Funktionalität in Form            zusätzlichen Code für Stubs und Skeletons und falls nötig
von Diensten anbieten, die über das Internet von anderen           Deployment-Deskriptoren generiert. Damit sind die Web Ser-
Anwendungen genutzt werden können.                                 vices sofort bereit für den Produktiveinsatz.
   Die wichtigsten Grundlagenstandards für Web Services sind          Das Ziel unserer Arbeit war es, diese Lücken in der Werk-
das SOAP-Protokoll [1], die Web Services Description Lan-          zeugunterstützung für PHP5 zu schließen. Im Folgenden wer-
guage (WSDL) [2] und Universal Description, Discovery and          den zunächst die entwickelten Werkzeuge einzeln vorgestellt.
Integration (UDDI) [3]. SOAP ist dabei das Kommunika-              Dabei wird besonders auf die Architektur und die getroffenen
tionsprotokoll für den Zugriff auf die Dienste. Mit WSDL           Design-Entscheidungen, die zu der jeweiligen Lösung geführt
werden vertragsähnliche Beschreibungsdokumente erstellt, die       haben, eingegangen. Danach wird in einer umfangreichen
ein Anbieter den Nutzern zur Verfügung stellen kann. UDDI          Beispielanwendung gezeigt, wie die Werkzeuge zusammen
ist der Standard für Namensdienste, mit denen Web Services         eingesetzt werden können, um eine Anwendung mit Web
bekannt gemacht und gesucht werden können.                         Service Schnittstellen auszustatten.
   Zur effektiven und interoperablen Nutzung von SOAP und,
mit Abstrichen, von WSDL existieren für alle üblichen Pro-
                                                                                II. E XTENDED R EFLECTION API
grammiersprachen und Plattformen voll ausgereifte Werkzeu-
ge, die für den Produktionsbetrieb eingesetzt werden können.          Zunächst besteht das Problem, an Informationen zu ge-
Für UDDI Namensdienste werden meist kommerzielle Pro-              langen, die in einer Programmiersprache formuliert sind.
2                                                                                           SEMINAR KONZEPTE UND METHODEN DER WEB-PROGRAMMIERUNG 2005/2006

                                                                                                 ReflectionProperty            ReflecionClass               ReflecionMethod          ReflecionParameter
Diese Informationen beschreiben die Funktionalität und den
Ablauf eines beliebigen Programms sowie die Schnittstellen                                      ExtReflectionProperty        ExtReflecionClass             ExtReflecionMethod      ExtReflecionParameter
von Komponenten. In vielen Sprachumgebungen gibt es zu
diesem Zweck sogenannte Reflection APIs, welche es mit der                                                                       ClassType

Programmiersprache selbst ermöglichen, an die gewünschten
                                                                                                                                 «interface»
Metainformationen zu gelangen.                                                                                                      Type

   Die in PHP5 integrierte Reflection API bietet die grund-
                                                                                                                                AbstractType
legenden Möglichkeiten, um zur Laufzeit Informationen zur                                                                                                                   ExtendedReflectionApi

Struktur der verfügbaren programmiersprachlichen Konstruk-                                                            PrimitiveType            ArrayType            +getTypeByName(in type : string) : Type
te, insbesondere der verfügbaren Klassen, Erweiterungen und
Funktionen, zu erhalten. Darüber hinaus bietet sie ebenso                                      Abb. 2.    UML-Darstellung der erweiterten Reflection API
die Möglichkeit auf Exemplare dieser Konstrukte zuzugreifen,
um den aktuellen Zustand zur Laufzeit zu ermitteln oder zu
modifizieren.                                                                                  Konstrukts, die gewünschten Typinformationen zu gewinnen.
                                                                                                  Dieses Typensystem erlaubt zusätzlich vielfältige eigene Er-
                                       «interface»
                                        Reflector
                                                                                               weiterungen. Durch die Verwendung einer TypeFactory ist
                                                                                               es möglich für verschiedene Anwendungsaspekte angepasste
                                                                                               Typenklassen zu entwickeln, die weitere Zusatzinformationen
    ReflectionProperty   ReflecionClass          ReflecionFunction     ReflecionParameter
                                                                                               zur Verfügung stellen. Aktuell implementiert ist unter anderem
                         ReflecionObject             ReflecionMethod                           die Möglichkeit, direkt aus den Typen ihre Definition in XML
                                                                                               Schema zu erhalten. Das ist hilfreich beim Erstellen von
Abb. 1.       UML-Darstellung der PHP5 Reflection API                                          XML Schema Beschreibungen für Anwendungen, die PHP-
                                                                                               Datenstrukturen nach XML serialisieren.
   In Abb. 1 ist die grobe Struktur der API dargestellt, welche                                   Eine weitere wesentliche Erweiterung ist die Implemen-
einem Metamodel für die Definition einer Klasse im Sinne der                                   tierung eines Annotation-Mechanismus, welcher in PHP bis
objektorientierten Programmierung entspricht. Da PHP5 selbst                                   dahin nicht verfügbar war, sich jedoch in anderen gängigen
eine schwach typisierte und teils sogar dynamische Sprache ist,                                Programmiersprachen zunehmender Beliebtheit erfreut. Für
bietet die API nur sehr wenige Informationen zur Typisierung                                   dieses Projekt steht die statische Verwendung von Zusatzinfor-
der einzelnen Sprachkonstrukte an. Um jedoch nicht nur zur                                     mationen im Vordergrund. So ist es möglich die programmier-
Laufzeit Informationen über die Typisierung erhalten zu kön-                                   sprachlichen Konstrukte mit zusätzlichen Eigenschaften zu
nen, wurde es erforderlich, die vorhandene API zu erweitern.                                   versehen, unter anderem die Kennzeichnung als Web Service.
Ziel dieser Erweiterung ist es zusätzliche Informationen in                                    Zusätzlich denkbar wäre es, diesen Annotation-Mechanismus
der Quelltext-Dokumentation der Sprachkonstrukte nutzen zu                                     durch eine geeignete Laufzeitumgebung zu nutzen, um aspekt-
können. Dabei wurde auf PHPDoc, die in der PHP-Welt                                            orientierte Programmierung unterstützen zu können. Dies ist
genutzte Variation des JavaDoc-Standards, gesetzt. Ursprüng-                                   in diesem Projekt jedoch nicht realisiert.
lich sind diese Informationen dazu gedacht, die arbeitsteilige
Entwicklung zu unterstützen, in dem der Quellcode durch                                                                      III. WSDL G ENERATOR
zusätzliche semantische Informationen angereichert wird.                                          Nachdem die Extended Reflection API das Problem ge-
   Da die PHPDoc-Tags sich in der PHP-Welt als Standard                                        löst hatte, Typinformationen für PHP5 Sprachkonstrukte zu
durchgesetzt haben und in vielen bestehenden Projekten von                                     ermitteln, konnten wir nun einen WSDL-Generator für die
diesen Gebrauch gemacht wird, bieten sie eine gute Basis                                       Erstellung von Web Services entwickeln. Die Web Service
um die nötigen Informationen aus den Quelltext-Kommentaren                                     Description Language (WSDL), welche in [4] näher erläutert
zu extrahieren, ohne neue Verfahren einzuführen, die in be-                                    wird, verwendet man um die Schnittstellen der Dienste zu
stehenden Anwendungen weitgehende Anpassungen erfordern                                        beschreiben. Anbieter von Web Services können ihren Nut-
würden.                                                                                        zern WSDL-Dokumente zur Verfügung stellen, aus denen sie
   Die erweiterte Reflection API nutzt zur Gewinnung der                                       erfahren, welche Operationen angeboten werden und welche
Typinformationen einen einfachen PHPDoc-Parser, welcher                                        Elemente in den SOAP-Nachrichten enthalten sein müssen
die Quellcode-Kommentare untersucht und interpretiert. Um                                      um sie zu nutzen. Die WSDL-Beschreibung ist dann eine
diese Informationen geeignet nutzen zu können, wurde eine                                      Art Vertrag zwischen den Kommunikationspartnern, an den
programmiersprachliche Repräsentation für ein einfaches Ty-                                    sich beide halten müssen um erfolgreich Nachrichten auszu-
pensystem entworfen.                                                                           tauschen. Der von uns entwickelte WSDL-Generator erzeugt
   In Abb. 2 ist das zentrale Interface Type dargestellt.                                      WSDL-Dokumente gemäß dem WSDL 1.1 Standard [2].
Dieses wird im wesentlichen von drei Klassen implementiert.                                       Bereits bei der Konzeption eines Web Services gibt es
PrimitiveType repräsentiert die einfachen Datentypen wie                                       zwei grundlegende Entscheidungen zu treffen: die Art des
Integer, Float und String, ArrayType alle möglichen                                            Methodenaufrufs und die Art der Datenrepräsentation in XML.
Array-Typen und ClassType alle Klassen. Damit ist es                                           Zuerst widmen wir uns den Aufrufsmodi.
möglich aus einem programmiersprachlichen Konstrukt, nicht                                        Ein Web Service kann durch zwei verschiedene Arten
nur zu dessen Laufzeit, sondern auch ohne ein Exemplar des                                     angestoßen werden - entweder über einen „Remote-Procedure-
WEB SERVICE TOOLKIT FÜR PHP5                                                                                                   3

Call“ (RPC) oder auf Basis des „Document“-Stils (DOC). Bei         wird generell nicht mehr empfohlen. Daher wurde bei der
RPC wird versucht, durch die Methode und deren Parameter           Entwicklung des WSDL-Generators der Fokus in erster Linie
einen Methodenaufrufsstack direkt beim Server nachzuahmen.         auf die Kodierungsart Literal gesetzt. Trotzdem ist er in
Die so aufgebaute Struktur, die diesen Stack repräsentiert, wird   der Lage, neben den WS-I-konformen Varianten auch das
dann zur Kommunikation genutzt. Der Client nimmt den Web           dennoch gebräuchliche RPC/Encoded durch die Erzeugung
Service als einzelne, logische Komponente mit gekapselten          entsprechender WSDL-Dateien zu unterstützen.
Objekten wahr. Die Komplexität wird also durch den SOAP               Abb. 3 zeigt die Schnittstelle über die der WSDL-Generator
RPC Stack verborgen.                                               genutzt werden kann. Der Generator selbst wird initialisiert
   Bei der DOC-Variante hingegen wird der Methodenaufruf           mit der Angabe des Namens für den zu erstellenden Service,
direkt auf ein XML Dokument abgebildet, das dann über              dem URI über den der Service erreichbar sein soll, dem
SOAP versendet wird. Der gesamte Nachrichtenaustausch zwi-         Namespace für die WSDL-Beschreibung und der gewünsch-
schen Client und Web Service ist hier durch die zugrunde lie-      ten SOAP-Bindung. Standardmäßig wird vom Generator die
gende XML Schema Beschreibung bereits vorgegeben. Da die           „Document/Literal-Wrapped“-Bindung erzeugt.
Nachricht die Art und Reihenfolge der Kommunikation bereits
vorgibt, muss diese demzufolge nur benannt werden um die
Parameterliste direkt übergeben zu können. Dadurch entsteht
bei der Kommunikation viel weniger Traffic, als es bei RPC
der Fall ist. Während nämlich die Methodenaufrufe durch den
Aufbau des Stacks erheblich mehr Overhead erzeugen, muss
man bei DOC nur die Nachricht aus dem Schema identifizieren
und kann die (benannten) Parameter direkt übergeben. Eine
genauere Darstellung der Auswirkungen der verschiedenen
SOAP Varianten auf die Performance ist unter [6] zu finden.
   Des Weiteren gibt es noch zwei verschiedene Kodierungs-
möglichkeiten, um die Übergabewerte beim Sender zu seriali-
sieren und beim Empfänger wieder zu rekonstruieren. Bei der
ersten Variante wird eine spezielle Kodierung verwendet. Die
einzige gebräuchliche Kodierung ist das im SOAP-Standard           Abb. 3.   Klassendiagramm des WSDL-Generators
[1] spezifizierte SOAP-Encoding. Diese schreibt vor, wie man
alle Typen der jeweiligen Programmiersprache, auf die vom             Der Entwickler kann dann entweder per setClass() eine
Standard definierten Typen von XML-Elementen abbildet.             Klasse, deren Funktionalität angeboten werden soll, einlesen
Wenn die Nachricht dann also versendet werden soll, müssen         lassen oder per addFunction() eine beliebige Menge
Client und Web Service dafür sorgen, diese Abbildungen zu          von Methoden zur Erbringung dieser Funktionalität nutzen.
nutzen. Die zweite Kodierungsart ist die „Literal“-Variante.       Es ist jedoch nicht möglich, diese beiden Methoden der
Hierbei wird für die Nachrichten keine spezielle Kodierung         Erstellung zu mischen, da sie sich gegenseitig ausschließen.
verwendet sondern reines XML, welches über XML Schema              Ab diesem Punkt wird die Extended Reflection API aktiv.
zu definieren ist. Der Nachteil hierbei ist, dass alle Daten-      Sie liefert nicht nur die Methodennamen, sondern Listen
konstrukte explizit durch eigene Schemas beschrieben werden        von ExtReflectionMethod-Objekten, an denen direkt
müssen.                                                            Informationen zu Parametern und Rückgabewerten abgefra-
   Diese zwei mal zwei Möglichkeiten lassen sich nun kom-          gen werden können. Dies ist ein großer Vorteile für den
binieren und so ergeben sich theoretisch vier Varianten, einen     WSDLGenerator, da er so nicht selbst die Klassen parsen
Web Service zu erstellen:                                          muss, um die benötigten Informationen zu erhalten.
   • RPC/Encoded                                                      Alle so gefundenen Methoden bzw. jede hinzugefügte
   • RPC/Literal                                                   Funktion muss in die WSDL-Datei abgebildet werden. Soll-
   • Document/Encoded                                              ten bestimmte Methoden nicht veröffentlicht werden, so
   • Document/Literal                                              kann das Policy-PlugIn, das im Abschnitt VII-B vorgestellt
   Document/Encoded wird jedoch nicht genutzt, da es sich          wird, genutzt werden. Es erhält als Eingabe die Liste der
schon in seiner Konzeption selbst widerspricht. Die Frage          ExtReflectionMethod-Objekte und liefert eine gefilterte
bleibt also: welche Kombination ist zu bevorzugen? Die Ant-        Liste zurück. Die Information, ob eine Methode veröffentlicht
wort liefert die Web Services Interoperability Organization        werden soll oder nicht, findet es in der angeschlossenen Da-
(WS-I), ein Industriekonsortium, das sich mit der plattform-       tenbank, die der Entwickler zuvor mit Hilfe des AdminTools
übergreifenden Kommunikation zwischen Web Services be-             für die entsprechende Klasse füllen muss. Im AdminTool kann
schäftigt. Web Services, welche die Anforderungen in den WS-       außerdem eine Beschreibung der Methode in die Datenbank
I Profilen erfüllen, können interoperabel über Plattform- und      eingepflegt werden, die dann automatisch, sofern das Policy-
Programmiersprachengrenzen hinweg kommunizieren. Das ist           PlugIn genutzt wird, mit in der WSDL-Datei ausgegeben wird.
nur mit solchen Web Services möglich, die auf den Kom-                Der schwierigste Teil der Abbildung von Methoden auf die
binationen RPC/Literal oder Document/Literal aufbauen. Die         WSDL-Beschreibung ist die korrekte Definition der Kodierung
Verwendung des SOAP-Encodings oder anderen Kodierungen             von komplexen Datentypen, da diese auch auf Clientseite er-
4                                                           SEMINAR KONZEPTE UND METHODEN DER WEB-PROGRAMMIERUNG 2005/2006

zeugt und verarbeitet werden müssen. Um das zu ermöglichen      reguläre Methode und ist in bereits bestehenden Systemen
ist der WSDL-Generator in der Lage, rekursiv XML-Schemas        völlig undenkbar. Zudem müssten die PHPDoc-Kommentare,
zu erstellen, die alle gebräuchlichen Datentypen abdecken.      um eine WSDL-Generierung zu ermöglichen, die tatsächlichen
Per Extended Reflection API werden so z.B. Klassen als          Typen für Argumente und Rückgabewert verleugnen.
solche erkannt. Damit ist der Generator in der Lage, die          In manchen Klassen findet man beispielsweise folgende
Klassestruktur rekursiv zu analysieren und das XML Schema       Konstruktionen um das Problem zu umgehen:
sukzessive zu ergänzen, sollten in einer Klasse selbst neue,    public function echoString($inputString) {
komplexe Datentypen als Attribute enthalten sein.                 if (isset($inputString->inputString)) {
   Damit dabei kein redundanter Code erzeugt wird, vermerkt         return array(
                                                                      ’echoStringResult’
der Generator die Namen der erzeugten Typen in einer Liste              => $inputString->inputString
und greift während der Verarbeitung auch auf diese zu.                );
   Der Generator erzeugt ein DOM-Dokument, das die WSDL-          } else {
Struktur enthält. Der Aufbau dieser Struktur beginnt mit dem        return $inputString;
Definition-Element, in dem alle verwendeten Namespaces            }
                                                                }
definiert werden und das alle anderen Beschreibungselemente
enthält. Dann folgt die Types-Sektion, die XML Schema           Die Fallunterscheidung macht die Methode wieder in ihrem
Beschreibungen für alle komplexen Datentypen enthält und,       gewohnten Kontext verwendbar, ist aber nur eine partielle
bei Verwendung einer Literal-Kombination, außerdem die          Lösung des Problems, da dies nur für Methoden mit ei-
Anfrage- und Antwortnachrichten definiert. Eine Liste der       nem einzigen Parameter funktioniert. Allgemein lässt sich
Methoden ist indirekt durch den Message-Teil gegeben, bei       das Problem lösen, indem man eine Adapter-Klasse einsetzt,
dem für jede Methode ein Element für die Anfrage und ein        die Methoden mit den gleichen Namen anbietet, und diese
Element für die entsprechende Antwort vorhanden ist. Darauf     anstelle der Original-Klasse beim SOAP-Server registriert.
folgt die PortType-Abteilung, in der die Methoden auf           Die Methoden der Adapter-Klasse rufen die Methode an der
Operationen abgebildet werden. Anschließend wird die Kom-       Original-Klasse mit den Argumenten aus dem vom SOAP-
bination aus Aufruf und Kodierung explizit in der Binding-      Server übergebenen Objekt. Der jeweilige Rückgabewert wird
Sektion angegeben und abschließend folgt das Service-           in ein Array verpackt bevor er zur Serialisierung an den SOAP-
Element, bei dem der Service an einen Port gebunden wird.       Server zurückgegeben wird.
   Auf die erzeugte Struktur kann der Anwender                     Eine einfache Beispielklasse könnte so aussehen:
dann      mit    den   Methoden      getString()         oder   /**
getDOMDocument()            zugreifen,    bzw.     sie    mit     * @webservice
saveToFile(filename)              in     das     Dateisystem      */
speichern. Zusätzlich gibt es die Möglichkeit durch             class Adder {
saveToFileAndStartSOAPServer(filename)                             /**
                                                                     * @webmethod
direkt einen SOAP-Server zu starten um den Web Service
                                                                     * @param integer $a
sofort zu testen.                                                    * @param integer $b
                                                                     * @return integer
                                                                     */
    IV. D OCUMENT /W RAPPED -A DAPTER -G ENERATOR                  public function add($a, $b) {
                                                                      return $a + $b;
   Um entfernte Funktionsaufrufe über Web Services mit einer       }
Document/Literal SOAP-Bindung realisieren zu können, wird       }
typischerweise ein Mechanismus verwendet, der auch als Do-
cument/Wrapped Bindung bezeichnet wird. Dabei sind in den       Für diese Klasse könnte dann ein möglicher Adapter folgen-
                                                                dermaßen implementiert werden:
SOAP-Nachrichten die serialisierten Argumente und Rückga-
bewerte einer Operation in einem zusätzlichen XML-Element       class AdderDocumentWrappedAdapter {
verpackt, so dass im Body der SOAP-Nachricht immer nur
                                                                  /**
ein einzelnes XML-Element mit einem oder mehreren Kind-
                                                                   * @var Adder
Elementen vorkommt. Die SOAP-Implementierung von PHP5              */
wurde entwickelt um alle Arten der SOAP-Bindung zu un-            private $target;
terstützen. Diese generische Auslegung führt allerdings dazu,
dass das Wrapping und Unwrapping bei Document/Wrapped             /**
Web Services nicht automatisch vom SOAP-Server vorge-               * @param Adder $target
                                                                    */
nommen wird, sondern durch die gerufene Methode oder              public function __construct($target = null) {
Funktion ausgeführt werden muss. Auf der einen Seite bie-            if (empty($target)) {
tet dieses Vorgehen für Anwendungen einige Freiheiten in               $this->target = new Adder();
der Verwendung von SOAP. Andererseits erfordert es, die              } else {
                                                                       $this->target = $target;
Signaturen der Methoden oder Funktionen anzupassen, um               }
eine Document/Wrapped Bindung zu nutzen. Eine solche              }
Anpassung verhindert allerdings die parallele Nutzung als
WEB SERVICE TOOLKIT FÜR PHP5                                                                                                                    5

    /**                                                                Für einige dieser Sicherheitsanforderungen existieren bereits
      * @param object $args                                         Lösungen, die auch mit PHP genutzt werden können. Die
      * @return array                               Integrität der Daten wird bereits sichergestellt durch den Ein-
      */                                                            satz des TCP-Protokolls zur Datenübertragung. Vertraulichkeit
    public function add($args) {
       return array(                                                kann realisiert werden, indem eine SSL-Verschlüsselung zum
         ’addResult’ =>                                             Beispiel in Form des HTTPS-Protokolls genutzt wird. Grund-
           $this->target->add($args->a, $args->b)                   voraussetzung für eine Autorisation ist ein authentifizierter
         );                                                         Benutzer. Die Authentifizierung von Benutzern ist der Aspekt
    }
}                                                                   mit dem sich Web Services Security (WSS) beschäftigt.
                                                                    Autorisation hingegen ist immer anwendungsspezifisch und
Die Adapter-Klasse sorgt transparent für das Unwrapping von         kann daher nicht durch Standards abgedeckt werden. Die
Argumenten und das Wrapping von Rückgabewerten. Die                 entscheidende Komponente, die für sichere Web Services mit
Original-Klasse muss dazu in keiner Weise angepasst werden.         PHP5 noch fehlte, war also eine Implementierung des WS-
  Ein solcher Adapter enthält keine anwendungsspezifische           Security-Standards.
Geschäftslogik und kann daher automatisch generiert werden.            Für die Umsetzung von Sicherheitsaspekten für Web Ser-
Auf Basis unserer Extended Reflection API haben wir einen           vices gilt es einige Designziele einzuhalten. Hierzu zählt
entsprechenden Code-Generator entwickelt. Abb. 4 zeigt die          vor allem, dass die Benutzung von Sicherheitsmechanismen
Schnittstelle, über die das Werkzeug genutzt werden kann.           nicht zu Lasten des Anwendungsentwicklers gehen darf. Eine
                                                                    Sicherheits-Implementierung sollte daher nur eine Erweiterung
                                                                    zur Geschäftslogik sein, die bei Bedarf ausgetauscht werden
                                                                    kann. Ein weiteres wichtiges Ziel ist Interoperabilität, denn
                                                                    Web Services dienen zur plattformübergreifenden Kommuni-
                                                                    kation. Die Sicherheitsmechanismen müssen also beispielswei-
                                                                    se problemlos mit .NET oder Java genutzt werden können.

                                                                    B. Mögliche Ansätze zur Absicherung von Web Services
                                                                       Ein grober Ablauf für eine mögliche Lösung könnte folgen-
                                                                    dermaßen aussehen:
                                                                       1) Anmelden, sowie Verschlüsseln der Anmeldedaten auf
                                                                          Seite des Clients
Abb. 4.   Klassendiagramm des Document/Wrapped-Adapter-Generators      2) Die Anmeldedaten auf Serverseite abfragen und auswer-
                                                                          ten
  Zusätzlich zu der Generierung von WSDL-Beschreibungen                3) Nach der korrekten Authentifizierung wird die Anfrage
wird somit auch dieser Schritt für die Erstellung von Web                 an die Web Service Implementierung weitergeleitet
Services mit PHP5 automatisiert.                                       Lösungen eines selbst implementierten Token-Prinzips sind
                                                                    immer möglich, stehen jedoch im Kontrast zu einer geforder-
                        V. WS-S ECURITY                             ten Interoperabilität. Demnach muss ein Standard gefunden
   Nicht immer möchte man seine Web Services jedem frei             werden, welcher genau diese Anforderungen erfüllen kann. In
verfügbar machen. Möglicherweise möchte man kostenpflich-           der Welt von Java und .NET hat dabei Web Services Securi-
tige Dienste anbieten oder sie nur unternehmensintern bzw.          ty1 von OASIS [7] eine weite Verbreitung gefunden. Dieser
mit ausgewählten Geschäftspartnern nutzen. Dabei werden die         Standard umfasst mehrere Teile. Das ist zum einen SOAP
Grenzen der Grundlagenstandards SOAP, WSDL und UDDI                 Message Security zum Verschlüsseln von Nachrichten und zur
schnell erreicht. Dies bedeutet nicht, dass keine möglichen         Behandlung von Fehlern. Zum anderen gibt es verschiedene
Lösungen existieren. Doch wenn keine einheitlichen Standards        Token Profiles, welche Authentifizierungsmechanismen für
verwendet werden, gehen die Lösungen schnell soweit ausein-         Web Services spezifizieren. Wir haben uns damit beschäftigt
ander, dass es an Interoperabilität mangelt und die Entwickler      das Username Token Profile 1.0 für PHP5 umzusetzen.
von Client-Applikationen Integrationsprobleme haben. Dieses
Kapitel wird sich mit Sicherheitsmechanismen für Web Ser-           C. Username Token Profile 1.0 im Detail
vices auseinander setzen.                                              Das Username Token Profile [8] wurde von OASIS er-
                                                                    arbeitet. Unsere Umsetzung basiert auf Version 1.0 dieses
A. Anforderungen an gesicherte Web Services                         Standards. Die Version 1.1 lag zu Beginn unserer Arbeit nur
                                                                    als Entwurf vor und der erweiterte Funktionsumfang wurde
  Wird allgemein von Sicherheit gesprochen, sind viele Din-         nicht benötigt. Des Weiteren wird Version 1.0 bereits durch
ge zu beachten. Dabei handelt es sich meist nicht nur um            diverse Middleware-Plattformen unterstützt und verspricht so-
funktionale, sondern auch um nicht-funktionale Anforderun-          mit eine gute Interoperabilität. Der Standard beschreibt keine
gen. Im Allgemeinen sind dabei die Punkte Datenintegrität,
Vertraulichkeit, Authentifikation und Autorisation anerkannt.         1 Basiert   auf Standard 1.0 (am 17.2.2006 wurde Version 1.1 veröffentlicht)
6                                                                      SEMINAR KONZEPTE UND METHODEN DER WEB-PROGRAMMIERUNG 2005/2006

neue Techniken, sondern gibt einen Rahmen vor, wie die                        Die letzten beiden Elemente werden nur für den Pass-
benötigten Informationen für eine Authentifizierung in einem               worttyp PasswordDigest benötigt und senden zum einen
standardisierten Format zu übertragen sind. Diese Informa-                 die Zufallszahl() im Base64-Format und zum
tionen umfassen zum Beispiel Benutzername und Passwort,                    anderen den Erzeugungszeitpunkt() mit.
aber auch technische Details wie Angaben zum verwendeten                      Bei den Elementen werden die XML Namensräume
Verschlüsselungsverfahren.                                                 wsse (http://docs.oasis-open.org/wss/2004/01/oasis-200401-
                                                                           wss-wssecurity-secext-1.0.xsd) und wsu (http://docs.oasis-
                                                                           open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-
                                                                           1.0.xsd) verwendet.
                                                                              Der Standard sieht vor, dass Anfragen mit einem alten
                                                                           Zeitstempel zurückgewiesen werden und ein Cache mit schon
                                                                           benutzen Zufallszahlen geführt wird. Als Minimum gibt der
                                                                           Standard eine Empfehlung von fünf Minuten an.
                                                                              Passwortäquivalent bedeutet in diesem Zusammenhang,
                                                                           dass dieses extern verschlüsselt sein kann und sollte. Bei unse-
Abb. 5.    Beispiel für die Elemente des Username Token Profils im SOAP-   rer Umsetzung gilt grundsätzlich das Passwörter immer MD5-
Header
                                                                           verschlüsselt sein müssen. Dementsprechend gilt auch beim
                                                                           PasswordText, dass ein Passwort einem MD5(Passwort)
   Das     Format    definiert   ein     neues    Element                  entspricht und nicht nur durch ein reines Passwort repräsentiert
 im SOAP-Header, welches weitere                            wird.
Elemente mit Web Services Security Daten kapselt. Darauf
                                                                              Für weitere Details sei auf den Standard [8] verwiesen. Es
folgt ein Element , das die
                                                                           wurden an dieser Stelle kurz und knapp die grundlegenden
Verwendung des Username Token Profils signalisiert und
                                                                           Ideen des Standards zu vermittelt. Im Nachfolgenden soll die
die benötigten Daten-Elemente enthält. Das Datenelement
                                                                           Umsetzung in PHP näher beleuchtet werden.
 muss immer angegeben werden und
enthält den unverschlüsselten Benutzernamen. Das nächste
Element  enthält das                             D. Erweiterter SOAP-Server mit WS-Security
Passwort des Benutzers oder Passwortäquivalent. Beim                          1) Vorhandene Komponenten: PHP bietet seit der Version
Attribut Type dieses Elements gibt es zwei mögliche Werte:                 5 eine Implementierung des SOAP-Protokolls in Form ei-
    •   PasswordText (Standardwert) Hierbei kann das Type-                 nes Erweiterungsmoduls. Mit dem Modul lassen sich eigene
        Feld leer gelassen werden und als Daten sind nur der               Web Services erstellen und vorhandene Dienste nutzen. Si-
        Username und das Passwort (bzw. Passwortäquivalent)                cherheitsmechanismen sind darin allerdings noch nicht inte-
        notwendig.                                                         griert. Die Umsetzung des Username Token Profiles für PHP
    •   PasswordDigest Beim Type-Wert PasswordDigest                       wird auf Basis der vorhandenen Klassen SoapClient und
        wird das Passwort verschlüsselt übertragen. Dabei werden           SoapServer erfolgen. Die erstellten PHP Klassen erben
        vom Standard keine Verschlüsselungsalgorithmen                     von diesen bzw. erweitern sie um die zusätzlich benötig-
        festgelegt, da diese austauschbar sein sollen. Um                  ten Aspekte. Dies hat den Vorteil, dass das Abarbeiten von
        sicherzustellen, dass keine Anfrage zweimal gesendet               SOAP-Nachrichten nicht nochmal neu implementiert werden
        werden kann (Replay-Attacke), wird das Passwort                    muss. Im Idealfall profitiert die erstellte Lösung auch von
        (Password) zusammen mit einem Zeitstempel                          zukünftigen Verbesserungen des SOAP-Erweiterungsmoduls.
        (Created) und einer Zufallszahl (Nonce) verschlüsselt.             Das Erweiterungsmodul selbst ist in C geschrieben und bietet
        Die Formel, nach der sich die Verschlüsselung                      somit einen klaren Geschwindigkeitsvorteil gegenüber anderen
        zusammensetzt, sieht nun wie folgt aus:                            SOAP-Stacks, die direkt in PHP implementiert sind.
                                                                              2) Probleme: Dieses Vorhaben erwies sich allerdings als
        PasswordDigest = Base64( SHA-1( Nonce                              etwas problematisch. Das liegt einerseits an der knappen Do-
        + Created + Password ))                                            kumentation der SOAP-Erweiterung, welche ein Review des
                                                                           C-Quelltextes unerlässlich machte, und andererseits an einigen
        Passwort,    Zeitstempel   und      Zufallszahl   sind             besonderen Features der SOAP-Erweiterung. Beispielsweise
        Zeichenketten, die aneinander gehängt, mit dem                     ruft der SOAP-Server anhand der Namen von Elementen
        SHA-1-Algorithmus verschlüsselt und Base64 kodiert                 im SOAP-Header automatisch Methoden gleichen Namens
        werden. Zufallszahl und Zeitstempel werden ebenfalls               auf. Dies stellt eine potentielle Sicherheitslücke dar, weil
        im SOAP-Header mitgeschickt. Der Server kann mit                   damit auch Methoden aufgerufen werden können, für die
        diesen beiden Informationen und dem ihm bekannten                  keine WSDL-Ports spezifiziert wurden. Es muss daher eine
        Passwort eine Vergleichswert errechnen, um damit die               Lösung gefunden werden, welche es ermöglicht die Header-
        Korrektheit der Anfrage zu überprüfen. Somit ist jede              Informationen aus der SOAP-Nachricht nach deren Verwen-
        Anfrage nur genau einmal gültig, denn das Ergebnis der             dung zu entfernen. Die aktuelle Implementierung des SOAP-
        Formel ist jedes Mal verschieden. Identische Anfragen              Servers hat noch einen weiteren Nachteil. Sie sendet nicht
        werden vom Server abgewiesen.                                      unter allen Umständen korrekte SOAP-Faults. Das senden si-
WEB SERVICE TOOLKIT FÜR PHP5                                                                                                                   7

cherheitsrelevanter Fehler-Nachrichten sollte aber immer kor-              problem der Ausführung von Methoden durch Header-
rekt ablaufen, gerade wenn Exceptions zur Laufzeit auftreten.              Elemente zu verhindern (siehe V-D.6 XmlSoapHeader-
                                                                           Parser).
                                                                           Die XML-SOAP-Parser sind demnach eine Anwendung
                                                                           des Strategy-Patterns2 , denn sie erlauben es, mehrere
                                                                           Algorithmen unter einem einheitlichen Interface anzu-
                                                                           sprechen und auszutauschen. Damit können Handler-
                                                                           chains aus mehreren SOAP-Intermediaries realisiert wer-
                                                                           den, denn es ist möglich, dem Extended SOAP-Server
                                                                           beliebig viele XML-SOAP-Parser zu übergeben und diese
                                                                           sequentiell der Reihenfolge nach abzuarbeiten.
                                                                           Das Username Token Profile ist folglich nur als ei-
                                                                           ne konkrete Umsetzung des XmlParserExtended
                                                                           (siehe V-D.4 XmlSoapSecParser) anzusehen. Dabei
                                                                           wird in der parse()-Methode auf das Interface
                                                                           ICheckUserRunnable verwiesen und es einer Im-
                                                                           plementierung dieser Schnittstelle überlassen, mit den ge-
                                                                           parsten Werten für Username, Password, Nonce und
                                                                           Created die die Anfrage auszuwerten. Nachdem die
                                                                           Authentifikation erfolgt ist, werden alle entsprechenden
                                                                           Elemente mit der delete()-Methode gelöscht.
                                                                        Durch die Trennung von Parser und SOAP-Server ist die
Abb. 6.   Erweiterungen des SOAP-Servers für Web Services Security   Lösung unabhängig vom implementierten Standard. Eine Um-
                                                                     stellung auf andere Token Profiles oder die Implementierung
  3) Extended SOAP-Server: Um die Sicherheitsmechanis-               weiterer Web Service Standards ist somit leicht möglich.
men in SOAP zu integrieren, wurde der „Extended SOAP-                   Damit eine Behandlung der SOAP-Nachricht noch vor der
Server“ entwickelt.                                                  Weiterleitung an den eigentlichen SOAP-Server (Ultimate Re-
  Dabei war ein wichtiges Designziel, dass weitere Standards         ceiver) erfolgen kann, wird die SOAP-Nachricht aus der globa-
möglichst einfach integrierbar sind. Dazu wurde von dem              len Variablen $HTTP RAW POST DATA ausgelesen und falls
Problem der Behandlung von Sicherheitsaspekten abstrahiert.          nötig durch die Parser angepasst. Das Ergebnis wird wieder in
  • XmlParser                                                        dieser Variablen gespeichert, da die gekapselte SOAP-Server-
    Bei Web Services handelt es sich um eine Übertragung             Implementierung auf diese Variable zugreift.
    von XML-Nachrichten Daher ist es offensichtlich, dass               Es soll hierbei erwähnt werden, dass die Reihenfolge der
    die Implementierung von XML-Handlern die Umsetzung               Parser einen entscheidende Bedeutung hat. Ein Parser, welcher
    von Web Service Standards massiv erleichtern kann. Es            den gesamten SOAP-Header entfernt, sollte erst zum Schluss
    gibt zwei grundsätzlich verschiedene Arten ein XML-              ausgeführt werden. Da allerdings der Extended SOAP-Server
    Dokument zu parsen. Auf dem Document Object Model                keine Kenntnis über die Semantik der genutzten XML-Parser
    (DOM) basierende Parser bilden im Speicher die Baum-             hat, ist der Entwickler dafür verantwortlich, die XML Parser
    struktur, des XML-Dokuments nach und ermöglichen so-             in der richtigen Reihenfolge beim Extended SOAP-Server
    mit den wahlfreien Zugriff auf alle Elemente. Die andere         zu registrieren. Diese Reihenfolge wird bei der Ausführung
    Möglichkeit sind sequentielle, Ereignis-getriebene SAX-          beachtet.
    Parser. Sie sind einfach beschrieben Tagsucher, welche              Nachdem die anspruchsvolleren Probleme gelöst werden
    bei jedem vorkommenden Tag eine Methode aufrufen.                konnten, blieb nur noch die Frage nach den SOAP-Faults (sie-
    Für das Parsen von SOAP-Nachrichten empfehlen sich               he V-D.7 SoapFaults) offen. Als gute Lösung erwies sich die
    dabei klar die SAX-Parser, da sie performanter sind und          Verwendung eines weiteren SOAP-Servers für das Versenden
    speichereffizienter agieren. Eine abstrakte Implementie-         von Fehlermeldungen. Dabei wird ein minimaler Web Service
    rung eines solchen Parsers, welcher Methodensignaturen           bereitgestellt, der nicht einmal Dienste anbietet, denn er dient
    definiert und eine Methode parse() bereitstellt, ist             nur zum Initialisieren des Servers. Mit diesem SOAP-Server
    der XmlParser. Diese Methode hat als Rückgabewert                ist es nun möglich korrekte SOAP-Faults zu erstellen.
    einen Fehlercode, der angibt, ob die Abarbeitung und                Damit sind alle eingangs benannten Sicherheitsprobleme
    Auswertung des Parsens erfolgreich war (return 0).               erfolgreich gelöst.
  • XmlParserExtended                                                   Allerdings ist es nun vom Design her nicht möglich einen
    Der XmlParser wird durch XmlParserExtended                       Extended SOAP-Server als Ableitung von SoapServer zu
    erweitert. Da jeder Parser das gesamte Dokument durch-           implementieren, da zwei Exemplare eines SOAP-Servers be-
    sucht, ist es sinnvoll schon benutzte Elemente zu ent-           nötigt werden. Daher kapselt der Extended SOAP-Server nun
    fernen, um doppelte Datenauswertungen zu verhindern.                2 „Define a family of algorithms, encapsulate each one, and make them
    Ebenso ist es möglich, durch die richtige Implementa-            interchangeable. Strategy lets the algorithm vary independently from clients
    tion der Methode deleteHeader() das Sicherheits-                 that use it.“ [9]
8                                                             SEMINAR KONZEPTE UND METHODEN DER WEB-PROGRAMMIERUNG 2005/2006

sämtliche Funktionen des SOAP-Servers und erweitert ihn um
die zusätzlichen Bestandteile (siehe Abb. 6).
   Sollten später die Probleme in der SOAP-Implementierung
behoben werden, ist eine Umstellung auf Vererbung aber
nicht grundsätzlich unmöglich. Da eine Trennung der XML-
Behandlung erfolgte, ist dies sogar mit relativ wenig Aufwand
möglich.
   Die Verwendung des Extended SOAP-Servers ist nun
nahezu identisch zu der des normalen SOAP-Servers. Es
wurde lediglich eine Methode nach außen hinzugefügt:
addXmlHandler() registriert entsprechend der Erläuterung
des Chain-Handlers neue XML-SOAP-Parser und führt sie aus.
   4) XmlSoapSecParser: Nachdem die Umsetzung eines Ser-
vers näher erläutert wurde, besteht nun die spannende Frage,      Abb. 7.   Username Token Profile - Ablauf Teil 1
wie der XML-SOAP-Parser für das Username Token Profile
aussieht.
   Der Parser sammelt aus dem SOAP-Header alle notwendi-          setzt werden kann. Um nun zu erkennen, ob PasswordText
gen Daten zusammen. Dazu zählen die Elemente Username,            oder PasswordDigest verwendet wurde, wird in die-
Password, Nonce und Created. Sind die benötigten Da-              sem Fall auf das Vorhandensein der Elemente Nonce und
ten ermittelt, so werden die Daten an eine Implementierung        Created geachtet.
des Interfaces ICheckUserRunnable übergeben. Dieses                  Nachdem der SOAP-Header ausgelesen und die notwendi-
wird intern in der Methode parse() aufgerufen, die damit          gen Daten übermittelt wurden, beginnt der Authentifikations-
auch Fehler nach außen reichen kann.                              prozess, der in dem Petrinetz (Abb. 7 und Abb. 8) dargestellt
   Die schon oft erwähnte Methode deleteHeader() dient            ist. Es lassen sich mehrere Wege durch das Petrinetz finden.
nun dazu den gesamten oder nur Teile eines Headers zu             Von links nach rechts gilt:
entfernen. Grundsätzlich ist es hiermit auch möglich den             1) Sollte entweder die Zufallszahl oder der Zeitstempel
Inhalt der gesamten SOAP-Nachricht zu löschen, was aber                  fehlen wird ein Fehler zurückgegeben. Dazu liefert die
wenig Sinn macht. Bei der Implementierung muss die Va-                   Methode parse() des XmlSoapSecParser nicht 0
riable $this->deleteTag einfach mit dem betreffenden                     sondern -101 (siehe V-D.7 SoapFaults)
Tag gesetzt werden. Nach der parse() Methode wird                    2) Handelt es sich um eine Anfrage vom Typ
dann automatisch eine Methode des XML Parsers durch                      PasswordText, dürfen weder Nonce noch
den ExtendedSoapServer aufgerufen, welche den ge-                        Created im SOAP-Header auftauchen. Ist dies
samten Inhalt des Tags löscht. Sollen keine Elemente des                 erfüllt findet die Authentifikation statt. Dabei kann
SOAP-Headers entfernt werden, so braucht die Variable                    es vorkommen, dass ein Benutzer unbekannt ist
$this->deleteTag nicht gesetzt zu werden. In der kon-                    (-104) oder sein Passwort ungültig ist (-105). Bei
kreten Implementierung des XmlSoapSecParsers wird der                    einer erfolgreichen Authentifikation wird in unserer
gesamte Inhalt des Security-Elements gelöscht.                           Beispielanwendung ein globales User-Objekt erzeugt,
   5) ICheckUserRunnable und CheckUserRunnable: Die                      das später für die Autorisation verwendet werden kann.
Trennung ist notwendig, da verschiedenste Datenhaltungstech-             Anschließend wird die Anfrage an den Web Service
niken zur Speicherung der für die Authentifikation benötigten            weitergeleitet, sofern keine anderen Parser einen Fehler
Benutzerdaten zum Einsatz kommen können. Nur so ist ge-                  melden.
währleistet, eine flexible Implementierung zu erstellen. In der      3) Der gesamte Security Header fehlt und es kann somit
Implementierung des Interfaces ICheckUserRunnable ist                    an dieser Stelle ein Gastaccount geladen werden.
die eigentliche Logik des Standards enthalten. Hier wurde als        4) Als letzter Zweig wird nun PasswordDigest abgearbeitet.
Beispiel eine Implementierung für die Benutzerverwaltung von             Dafür wird als erstes das Alter der Anfrage überprüft.
tele-TASK erstellt.                                                      Dabei gilt, alle Anfragen älter als fünf Minuten zu
   Um den Ablauf zu verdeutlichen wurde ein Petrinetz erstellt,          verwerfen (-106). Sollte dies nicht der Fall sein wird die
welches die Reihenfolge der Überprüfungen verdeutlicht. Es               Zufallszahl dekodiert (Base64), alle alten Zufallszahlen
besteht aus zwei Teilen um die Komplexität etwas zu verrin-              werden entfernt und es wird überprüft ob diese Zahl
gern. (siehe Abb. 7 und 8)                                               schon vorhanden ist (-106).
   Die Implementierung des Username Token Profiles benötigt              Sollte nun die gestellte Anfrage nicht doppelt oder zu alt
eine relationale Datenbank. Diese wird durch ADOdb und der               sein, so wird zuerst das Passwort (MD5 verschlüsselt)
Klasse CheckUserDB gekapselt. Die entsprechende Daten-                   vom Server geholt. Sollte dies fehlschlagen ist hier
banktabelle besitzt zwei Spalten mit den Attributen für Nonce            ebenfalls der Benutzer unbekannt(-104). Mit dem nun
(Primary Key) und dem Created-Zeitstempel. Mit diesen In-                erhaltenen Passwort wird auf Serverseite ein zweiter
formationen lassen sich doppelte und zu alte Anfragen filtern.           Vergleichshashwert berechnet und mit dem Wert aus
   Etwas problematisch ist, dass das type-Attribut im                    der SOAP-Nachricht verglichen. Konnte der Hashwert
Password-Element durch den PHP5 SOAP-Client nicht ge-                    korrekt erzeugt werden, so ist die Anfrage gültig und
WEB SERVICE TOOLKIT FÜR PHP5                                                                                                             9

                                                                                8) Fazit: Als Abschluss soll noch einmal ein kritischer
                                                                             Blick auf die erstellte Lösung geworfen werden. Es sind
                                                                             alle geforderten Ziele umgesetzt worden. Die Benutzung des
                                                                             Extended SOAP-Servers unterscheidet sich nur durch die
                                                                             Anwendung von XML Parsern. Die WSDL-Beschreibung und
                                                                             die anwendungsspezifischen Klassen, welche die WSDL-Ports
                                                                             implementieren, bleiben dagegen völlig identisch.
                                                                                Die unabhängige Implementierung der Sicherheitsaspekte
                                                                             konnte durch das Strategy-Pattern gelöst werden. Für eine
                                                                             Umsetzung von weiteren Web Services Standards wurde damit
                                                                             eine solide Grundlage geschaffen.
                                                                                Etwas unschön ist lediglich, dass der Extended SOAP-
                                                                             Server nicht direkt von dem SOAP-Server der PHP-
                                                                             Erweiterung abgeleitet werden konnte. Falls zukünftige Ver-
                                                                             sionen der SOAP-Implementierung dies wieder möglich ma-
                                                                             chen, ist ein Refactoring des Extended SOAP-Servers mit sehr
                                                                             geringem Aufwand möglich.
                                                                                Nachdem die Implementierung von Web Services Security
                                                                             und dem Username Token Profile auf Serverseite erklärt
Abb. 8.     Username Token Profile - Ablauf Teil 2                           wurden, soll nun ein entsprechender SOAP-Client vorgestellt
                                                                             werden.
      kann weitergereicht werden (Globales Userobjekt wird
      erzeugt und return 0 als Rückgabewert geliefert).                      E. Umsetzung eines SOAP-Clients mit WS-Security
      Andernfalls wird auch hier ein Fehler zurückgegeben                      Das SOAP-Erweiterungsmodul von PHP5 stellt stellt einen
      (-105)                                                                 SOAP-Client zur Verfügung, der punktuell für das Userna-
   6) XmlSoapHeaderParser: Dieser Parser löscht den ge-                      me Token Profile erweitert wurde. Dabei konnte hier wie
samten SOAP-Header. Dazu nutzt er die Funktiona-                             in Abb. 9 gezeigt von einer Vererbung profitiert werden.
lität des XmlParserExtended zum Entfernen von                                Aus der von vorhandenen Klasse SoapClient wurde der
Header-Elementen. Dies funktioniert wie schon zuvor in                       SecureSoapClient entwickelt.
XmlSoapSecParser beschrieben. Dabei ist der einzige
Unterschied, dass nicht nur das Security-Tag entfernt wird,
sondern sogar der gesamte SOAP-Header. Dieser Parser sollte
daher als letzter an den Extended SOAP-Server übergeben
werden.
   7) SOAP-Faults: Die passenden SOAP-Faults für die jewei-
ligen Fehlersituationen sind ebenfalls im Web Services Securi-               Abb. 9.   Klassenstruktur des Clients
ty Standard spezifiziert (siehe [7] Soap Message Security 1.0).
Tabelle I zeigt die internen Fehlercodes und die zugehörigen                    Dazu wurde der Konstruktor leicht verändert, damit die zu-
standardisierten SOAP-Faults sowie deren Beschreibung.                       sätzlichen Parameter wie Name und Passwort entgegengenom-
                                                                             men werden können. Dieser bietet demnach nun 4 Parameter
                                  TABELLE I
                                                                             an in denen die zusätzlichen Informationen übergeben werden:
                                F EHLERCODES
                                                                             __construct($wsdl , $options, $user, $pw).
 Interner      Fault-                            Fault-                         Mit den zusätzlichen Daten generiert der Client bei jedem
 Code          Code                              String                      Aufruf von __call() automatisch den benötigten SOAP-
 -101          wsse:UnsupportedSecurityToken     An unsupported token
                                                 was provided                Header. Die Benutzung der Klasse ist dabei verglichen mit
 -102          wsse:UnsupportedAlgorithm         An unsupported signature    SoapClient nahezu identisch und unterscheidet sich ledig-
                                                 or encryption algorithm     lich im erweiterten Konstruktor. Das macht es Anwendern sehr
                                                 was used
 -103          wsse:InvalidSecurity              An error was discovered
                                                                             leicht die Sicherheitsmechanismen zu integrieren.
                                                 processing the                 Die Erstellung des SOAP-Headers ist allerdings mit
                                                  header      der SOAP-Erweiterung von PHP5 etwas umständlich. Es
 -104          wsse:InvalidSecurityToken         An invalid security
                                                 token was provided
                                                                             ist erforderlich eine Struktur von Structs zu generieren,
 -105          wsse:FailedAuthentication         The security token could    um einen konformen Header erzeugen zu können. Hierbei
                                                 not be authenticated        kommen auch die Klassen SoapVar und SoapHeader
                                                 or authorized               aus der SOAP-Erweiterung zum Einsatz. Der sogenannte
 -106          wsse:FailedCheck                  The signature or
                                                 decryption was invalid      SecurityStruct, der das Username Token kapselt, wird
 -107          wsse:SecurityTokenUnavailable     Referenced security token   an SoapVar übergeben, welches daraus eine XML konforme
                                                 could not be retrieved      Darstellung erzeugt. Das Ergebnis wird anschließend dem
10                                                             SEMINAR KONZEPTE UND METHODEN DER WEB-PROGRAMMIERUNG 2005/2006

SoapHeader übergeben. Dabei ist leider zu beachten, dass              Das Administrations-Tool, das in Kapitel VII näher erläutert
type-Attribute innerhalb eines Elements nicht erzeugt werden       wird, wurde so erweitert, dass es mit einem zusätzlichen Flag
können. Damit ist die Interoperabilität vom PHP-Client zu          sichere Web Services erstellen kann.
beliebigen Web Services Security Servern leider nicht mög-
lich. Aufgrund dessen, dass der Client nur PasswordDigest          G. Interoperabilität
unterstützt, aber dies im Tag nicht identifizieren kann, wird er
                                                                      Um die Interoperabilität zu überprüfen, wurde der sichere
von anderen Servern als PasswordText interpretiert und dies
                                                                   Web Service mit einem C# und einem Java Client getestet. Bei-
sorgt für eine Ablehnung der Anfrage. Bei dem erstellten
                                                                   de Interoperabilitätstests verliefen erfolgreich. Die Umsetzung
Extended SOAP-Server ist dies kein Problem, da er dies
                                                                   des User Token Profiles auf Client Seite wird hier nicht näher
anhand der übergebenen Argumente herleitet und somit der
                                                                   erläutert. Es sei hier auf die Referenzimplementierungen3
Server einfach und problemlos mit dem Client kommunizieren
                                                                   verwiesen.
kann. Demnach ist ein Erfolg bei anderen Servern abhängig
von deren Implementierung.
   Im Prinzip ist die Implementierung des Clients recht un-                        VI. REST FUL W EB S ERVICES
spektakulär. Jedoch wurden einige undokumentierte Funk-            A. Representational State Transfer (REST)
tionen der SOAP-Erweiterung benutzt, was die Entwicklung              Der Begriff REST bzw. Representational State Transfer
weitaus schwieriger gestaltete, als anfänglich angenommen          geht auf Roy Thomas Fielding zurück und wird in [10] im
wurde.                                                             Zusammenhang mit Web Services näher beleuchtet. Für Web
   Dieser Client kann durchaus als Vorlage für die Implemen-       Services im Allgemeinen ist eine Implementierung des REST-
tierung weiterer Token Profiles dienen. Eine Umstellung auf        Archtiekturstils in Verbindung mit dem Hypertext Transfer
PasswordText wäre relativ problemlos möglich, um Interope-         Protocol (HTTP) besonders interessant und soll hier kurz
rabilität zu anderen Servern gewährleisten zu können.              aufgegriffen werden.
                                                                      Der Hauptgedanke bei RESTful Web Services liegt in der
                                                                   Verwendung eines uniformen und minimalen Interfaces für
F. Einbettung in das Gesamtsystem
                                                                   alle Web Services, unabhängig von einem speziellen Einsatz-
  Nachdem die Implementierungen von Server und Client              bereich. Dies steht damit im Gegensatz zu den auf SOAP auf-
vorgestellt wurden, soll nun ein Blick auf das Gesamtsystem        bauenden Web Services, welche als gemeinsame Basis nur das
geworfen werden. Dabei wird das aus [5] bekannte Modell zu         SOAP-Nachrichtenformat verwenden und darauf aufbauend
Grunde gelegt (siehe Abb. 10).                                     jeweils eigene anwendungsspezifische Nachrichtenprotokolle
                                                                   und Schnittstellen definieren.
                                                                      Wie in [10] dargelegt, hat es verschiedene Vorteile, eine
                                                                   allgemeingültige Schnittstelle zu verwenden, unter anderem
                                                                   wird damit die Interoperabilität verbessert, da unabhängig von
                                                                   einer speziellen Implementierung Aussagen über das zu erwar-
                                                                   tende Verhalten getroffen werden können. In Bezug auf HTTP-
                                                                   REST ergeben sich außerdem Vorteile bei der Verwendung
                                                                   von URI (Uniform Resource Identifier) bezogenen Fähigkeiten
                                                                   von diversen bestehenden Standards (z.B. XML-Dialekte), da
                                                                   so die Ressourcen eines RESTful Web Services ohne Umwege
                                                                   direkt in diesen Anwendungen verwendet werden können. Bei
                                                                   SOAP basierten Diensten ist für solch eine Verwendung bisher
                                                                   immer ein Zwischenschritt nötig, da die Ressourcen dieser
                                                                   Dienste in einem eigenen Namensraum definiert sind.

                                                                   B. Realisierung mit Hilfe des Toolkits
                                                                      Für die Erstellung eines Web Services nach dem REST-
                                                                   Architekturstil sind verschiedene konzeptionelle Schritte nötig,
                                                                   die im Tutorial [11] und in [10] erläutert werden.
Abb. 10.   Gesamtaufbau mit Sicherheit                                Prinzipiell sollte man sich an dieser Stelle des Konzepts
                                                                   einer Remote-Facade [12] bedienen, welche das System
   In diesem Aufbaumodell wurde nun der Security Agent             nach außen hin in geeigneter Weise kapselt und die Methoden
detaillierter dargestellt. Der Extended Server übernimmt dabei     zum Abfragen und Manipulieren der Ressourcen des Dienstes
die Kapselung des eigentlichen SOAP-Server und leitet die          bereitstellt.
Anfrage an die zwei Parser weiter, die damit entsprechend             Das Toolkit stellt nun die benötigten Mechanismen bereit,
ihrer Funktion umgehen. Als letzter neuer Bestandteil über-        um den entworfenen URI-Namensraum des REST Services auf
nimmt User Token Check die Authetifikation mit Hilfe der             3 Microsoft Web Services Enhancements 3.0 www.microsoft.com und Java
Datenbank und dem User Management.                                 Axis 1.3 http://ws.apache.org/axis/
WEB SERVICE TOOLKIT FÜR PHP5                                                                                                                                              11

diese Methoden abzubilden und die Ressourcenrepräsentatio-        Administration Tool des Web Service Frameworks
nen in geeigneter Weise wählen zu können. Dafür lässt sich           Wizard       Klassen registrieren    Klassen konfigurieren   Web Service erstellen   Einstellungen

über einen regulären Ausdruck der Aufbau der URIs angeben,
welche den Ressourcen entsprechen, die durch eine Methode           Einstellungen
repräsentiert werden. Für jede dieser Methoden kann außerdem             Standardsuchpfad für Web Service Klassen:
                                                                         C:/Programme/Apache Group/Apache2/htdocs
der passende Serializer sowie Deserializer angegeben werden,
                                                                         Standard-Server:
um die Anfragedaten in programmiersprachliche Konstrukte                   SOAP-Server
                                                                          
                                                                          
                                                                          
                                                                          
                                                                          
                                                                           REST-Server
                                                                          
                                                                          
                                                                          
                                                                          
bzw. in ein gewähltes Datenformat zu überführen.                         Sicherheit:
                                                                           WS-Security (Username/Token-Profile)
   Als Ergebnis wird mit Hilfe eines Tools aus diesen Angaben             
                                                                          
                                                                          
                                                                          
                                                                          
                                                                           Keine
                                                                          
                                                                          
                                                                          
                                                                          

heraus ein Deployment Descriptor generiert, welcher von dem          Abbrechen     Ok

durch das Toolkit bereitgestellten RESTServer interpretiert
wird, um die Anfragen an den Service abzuarbeiten.               Abb. 11.        Grafische Oberfläche des Administrations-Tools

C. Sicherheit für RESTful Web Services                           zu konfigurieren. Klassen werden entweder automatisch in
   Da diese Form der Web Services allein auf HTTP aufsetzt,      einem gegebenen Klassenpfad gesucht oder können einzeln
kann hier ohne weitere Schwierigkeiten auf die Standardme-       angegeben werden. Dabei kann schon der Programmierer einer
chanismen zur Gewährleistung von Sicherheit zurückgegriffen      Web Service Klasse mit Hilfe der Annotation @webservice
werden. Sei dies nun mit HTTP over TLS (HTTPS) [13] die          seine Klasse als Web Service Klasse markieren. So markier-
Verschlüsselung der Datenübertragung oder die Basic bzw.         te Klassen können vom Administrations-Tool herausgefiltert
Digest Authentifizierungsmechanismen [14] zum Steuern des        bzw. explizit gesucht werden. Zu einer registrierten Klasse
Zugriffs auf den Service. HTTPS ist in den meisten Fällen an-    kann nun angegeben werden, welche ihrer Methoden letzt-
wendungsunabhängig über den HTTP-Server realisierbar, für        endlich veröffentlicht werden sollen. Auch dafür gibt es eine
die Authentifizierung hingegen ist oft eine direkte Einbindung   Annotation (@webmethod). Des Weiteren hat der Admi-
in die Anwendung wünschenswert.                                  nistrator die Möglichkeit sich Kommentare zu den Klassen
   Diese Anbindung erfolgt über die Implementierung des          und Methoden aus dem Quellcode anzeigen zu lassen. Zu
AuthProvider-Interfaces. Die kann dann über eine entspre-        diesen kann er zusätzlich eigene Kommentare hinzufügen,
chende Konfiguration des RESTServers verwendet werden.           die dann von anderen Programmen weiterverwendet werden
Je nach gewünschtem Authentifizierungsverfahren gilt es hier     können. Eines dieser Programme ist der WSDL-Generator, der
darauf zu achten, dass gegebenenfalls die Nutzerpasswörter in    vom Administrations-Tool genutzt wird um WSDL-Dateien
einer geeigneten Art und Weise abgelegt werden. Details dazu     zu erzeugen (siehe Kapitel III). Diesem können die eigenen
sind in der Beschreibung des Interfaces bzw. im entsprechen-     Kommentare zur Beschreibung von Web Service Klassen
den Abschnitt des Tutorials zu finden.                           und Methoden übergeben werden. Ein weiteres Programm,
                                                                 das vom Administrations-Tool genutzt wird, ist der Adapter-
    VII. A DMINISTRATIONS -T OOL & P OLICY-P LUG I N             Generator, der zur Erzeugung von speziellen Adapter-Klassen
                                                                 für Document/Wrapped Web Services dient (siehe Kapitel IV).
  Das Administrations-Tool ist eine grafische Oberfläche, die
                                                                    Letztendlich erzeugt das Administrations-Tool mit Hilfe
der einfachen Konfiguration und Verwendung der Werkzeuge
                                                                 der Generatoren und der Informationen zu den Web Service
des Web Service Frameworks dient. Das Policy-PlugIn hin-
                                                                 Klassen die jeweils notwendigen Dateien zur Bereitstellung
gegen fungiert als Filter für Web Service Klassen bzw. deren
                                                                 eins Web Services und legt diese in dem vom Benutzer
Methoden.
                                                                 gewünschten Verzeichnis im Dateisystem ab.
                                                                    Das Administrations-Tool bietet auch einen Assistenten
A. Administrations-Tool                                          (Wizard), mit dessen Hilfe Web Services im Frage-Antwort-
   Das Administrations-Tool soll dem Benutzer die Hand-          Stil aufgesetzt werden können.
habung des Web Service Frameworks erleichtern. Das Web
Service Framework stellt eine Reihe nützlicher Programme
zur Verfügung, die völlig unabhängig voneinander eingesetzt      B. Policy-PlugIn
werden können. Hier setzt das Administrations-Tool an, dass         Wie schon erwähnt, dient das Policy-PlugIn der Filterung
eine intuitive und zentrale Möglichkeit der Administration und   von Web Service Methoden. Hauptnutzer des PlugIns ist der
Konfiguration der Werkzeuge bieten soll.                         WSDL-Generator. Dieser bekommt mit Hilfe des PlugIns
   Das Administrations-Tool nutzt eine eigene Bibliothek, die    diejenigen Methoden einer Klasse heraus, die zur Veröffent-
die grundlegende Funktionalität zur Verfügung stellt und die     lichung mittels Web Service gedacht sind. Auch das Policy-
Anbindung an die externen Tools kapselt. Darüber hinaus wird     PlugIn benötigt eine Datenbankanbindung, welche wiederum
für die Anbindung der Datenbank ADOdb genutzt und das            durch ADOdb gekapselt wird. Durch das PlugIn werden in
Benutzerinterface wird mit Hilfe der Smarty Template Engine      der Datenbank Informationen zu Klassen, deren Methoden
realisiert.                                                      und Kommentare hinterlegt. Schon durch die Benutzung des
   Allgemein hat der Nutzer die Möglichkeit Klassen beim         PlugIns wird eine Klasse samt ihrer Methoden registriert und
Administrations-Tool zu registrieren und diese anschließend      kann dann wie beschrieben konfiguriert werden.
Sie können auch lesen