Web Service Toolkit für PHP5
←
→
Transkription von Seiteninhalten
Wenn Ihr Browser die Seite nicht korrekt rendert, bitte, lesen Sie den Inhalt der Seite unten
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 alsWEB 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 dem10 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