Login realisieren mit PHP + SOAP

Hallo Gemeinde.
Ich muss einen SOAP-Webservice mit PHP erstellen. An diesem soll man sich anmelden. Danach kann man seine Abfragen stellen, um sich dann wieder abzumelden.
Die Grundzüge stehen:

class MyService{
function login(){
–session variable setzen
}
function machwas(){
wenn eingeloggt dann ok
}
function logout(){}

}

server initialisiert
usw.

Aber: bei jedem Aufruf wird eine neue Session erstellt und ich kann nicht nachvollziehen, wie ich dem Server mitteile, welche Session er aufnehmen soll, um zu prüfen, ob sich der User schon angemeldet hat.

Kann mir bitte jemand helfen? Danke!!
Grüße!

hallo.

soap ist eine webservice-technologie mit deren hilfe man eine api nach außen - also zur anbindung externer applikationen - zur verfügung stellen kann.

diese „externen applikationen“ sind (wie du an deinem beispiel merkst) nicht immer browser. ja sogar sind es selten bis garnicht browser.

nur browser empfangen und senden cookies, die session-id’s enthalten.

daher musst du über eine session-lose authentifizierung nachdenken.
diese läuft im groben so ab:

  1. client verbindet und senden einen api-key
  2. server checkt, ob der api-key gültig ist
  3. wenn api key gültig, dann liefere daten an den client. wenn nicht, informiere den client über missglückte authentifizierung

du musst dies alles nicht in php implementieren.
sofern dein services „einfacher natur“ ist und keine extremen sicherheitsanforderungen hat, kannst du das via http-basierter digest-authentifizierung machen.

sollte sicherheit eine große rolle spielen, könntest du oauth implementieren.
oauth ist eine token-basierte authentifizierungsmethode.

ich kann dir die grundlegenden prinzipien und art und weise der implementierungen hier nicht im detail erläutern aber ich habe ein paar links zur konstultation.

http://en.wikipedia.org/wiki/Digest_access_authentic…

http://httpd.apache.org/docs/2.2/howto/auth.html

http://oauth.net/documentation/getting-started/

solltest du noch weitere fragen haben, frag :wink:

  • b

Wenn Du eine Datenbank hast, dann schreib einfach die User-ID (kann auh automatisch vergeben werden) und die SessionID in eine Tabelle. Dann kannst du bei jedem Seitenaufruf prüfen, ob sich die SessionID schon angemeldet hat…

Hallo bfreek,
danke für die schnelle und kompetente Antwort.

Anbei mal der Code des PHP-Servers. Interessanterweise geht es so. Allerdings liefere ich quasi einen Auth-Code in Form der Session Id. Durch die Funktion startSession() wird quasi die gleiche Session, wie vorher gestartet. Darin liegt dann das Login=true.
Dabei ist es entscheidend, die Session vorher zu killen.
Mal sehen, ob das in der Praxis stand hält… ???

Nochmals DANKE!

<?php ini_set("soap.wsdl_cache_enabled", 0);
ini\_set("session.autostart", 0); class MyWebServiceClass{ private function startSession($\_sessionId){ session\_destroy(); session\_id($\_sessionId); session\_start(); } public function doLogin($\_user, $\_pass){ if($\_user == "cvb" && $\_pass == "gaga123"){ $this-\>logon = true; $\_SESSION['logon']=true; return session\_id(); }else{ return false; } } public function getProductList($\_sessionId){ $this-\>startSession($\_sessionId); if($\_SESSION['logon']==false){ return "ausgeloggt"; }else{ return "eingeloggt"; } } public function doLogoff($\_sessionId){ $this-\>startSession($\_sessionId); unset($\_SESSION['logon']); return "out"; } } session\_start(); $SOAPServer = new SoapServer("[http://dmi.local/external/api/soap/WebService.wsdl"](http://dmi.local/external/api/soap/WebService.wsdl%22)); $SOAPServer-\>setClass('MyWebServiceClass'); $SOAPServer-\>setPersistence(SOAP\_PERSISTENCE\_SESSION); $SOAPServer-\>handle(); ?\>

Vielen Dank für die schnelle und kompetente Antwort.
Anbei der Code des PHP-Servers, mit dem es zu klappen scheint.
Bei der Anmeldung wird die Session Id zurückgegeben. Beim Aufrufen von Funktionen muss man diese ID übergeben. Aus der wird die Session wieder gestartet und darin liegt die Variable für das Login. Mal sehen, ob es sich in der Parxis bewährt.
DANKE für die Antwort!

<?php ini_set("soap.wsdl_cache_enabled", 0);
ini\_set("session.autostart", 0); class MyWebServiceClass{ private function startSession($\_sessionId){ session\_destroy(); session\_id($\_sessionId); session\_start(); } public function doLogin($\_user, $\_pass){ if($\_user == "cvb" && $\_pass == "gaga123"){ $\_SESSION['logon']=true; return session\_id(); }else{ return false; } } public function getProductList($\_sessionId){ $this-\>startSession($\_sessionId); if($\_SESSION['logon']==false){ return "ausgeloggt"; }else{ return "eingeloggt"; } } public function doLogoff($\_sessionId){ $this-\>startSession($\_sessionId); unset($\_SESSION['logon']); return "out"; } } session\_start(); $SOAPServer = new SoapServer("http://localhost/soap/WebService.wsdl"); $SOAPServer-\>setClass('MyWebServiceClass'); $SOAPServer-\>setPersistence(SOAP\_PERSISTENCE\_SESSION); $SOAPServer-\>handle(); ?\>

Hallo,

da dein Codeteil sehr begrenzten Umfang hatte gehe ich einfach mal davon aus, dass du mit normalen PHP Sessions zu arbeiten versuchst.
Das kann natürlich nicht funktionieren.
Beim SOAP Server kommen die Anfragen ja von einem anderen Server.
Der SOAP Client, also das PHP Skript, das der User direkt aufruft kennt die Cookies und entsprechend auch die Session Variablen wenn es dort welche gibt.

Um dein Problem zu lösen wirst du eine eigene Session programmieren müssen.
Beim Login legt der SOAP Server in der Datenbank eine Session mit einer eindeutigen ID an und gibt diese dann an den SOAP Client zurück.
Dieser Speichert die ID entweder in der eigenen Session, in einem Cookie o.ä. und gibt sie dann bei jedem weiteren Aufruf an den SOAP Server mit.
Dieser schaut dann, ob die ihm übergebene ID zu einer der Sessions in der Datenbank passt.

Viele Grüße

Hallo Christoph

Wie setzt du denn die SESSION ?
z.B
$_SESSION[„user“]=„ok“;
und bei jedem Scriptaufruf auf der Site kannst
mit
if($_SESSION[„user“]==„okay“){
machwas();
}
prüfen, ob der User eingeloggt ist.
Wenn der User den Browser schliesst dann verfällt die Session. Die Variable $_SESSION
wird auf dem Server abgelegt und somit hat jeder User eine individuelle $_SESSION Variable.
Ich weiss leider nicht wie dein Kenntnistand ist, darum habe ich mich auf das einfachste beschränkt.
Obwohl ein SOAP Service doch einiges mehr enthält, so das ich schliesse, das das obige gesagte vielleicht für dich trival ist.

Gruß Lars

Hallo Christoph,
im SOAP-Header kann die Session-ID mitgegeben und auch in der Response wieder zurückgegeben werden.
Grüße
Sven

Hallo Christoph

Wie kommsts du darauf, dass jedes Mal eine neue Session gestartet wird? Bekommst du eine Fehlermeldung, oder ist die Variable nach dem Laden einfach wieder weg?

Wichtig ist dass session_start() immer das aller Erste ist, das im Code steht. Es kann passieren, dass das so bei dir ist, der Browser das aber nicht erkennt. Im ersten Moment hört sich das schwachsinnig an. Dazu ein Beispiel aus meiner Erfahrung: Die meineSeite.php war mit UTF-8 codiert. Dadurch hatte ich unerwartete Leerzeichen im Text. Lösung dazu: Datei herunterladen, mit dem Editor öffnen und beim Spiechern mit ANSI Codieren. Dadurch stand session_start() wieder am Anfang, ohne überflüssige Leerzeichen davor.

Ich hoffe das hilft dir weiter. Ansonsten schreib mich einfach an.

Gruß Stefan

Hallo Christoph,

leider kann ich dir da auch nicht weiterhelfen. Ich kenne mich zwar recht gut mit dem SOA-Protokoll und -Mechanismen aus, aber nicht mit der konkreten Umsetzung in PHP.

Hoffe dass dir jemand anderes weiterhelfen konnte :smile:

Grüße,
Robert