Tutorials - Entwicklung - SOAP Server mit WSDL als Login-Server

Entwicklung: SOAP Server mit WSDL als Login-Server

rob (57)

rob

12.08.2002 00:42

Vinn

  • 323 Postings, noch 27 bis zum nächsten Level (350)

Postings: 323

SOAP Server mit WSDL als Login-Server

Mittwoch, 28. Juli 2004 13:07

  • 0.0/6 Votes: 0
0.0/6 Votes: 0

Im folgenden soll ein SOAP-Server mit WSDL erstellt werden, über welchen man ein Login realisieren kann.

Es geht los mit dem Einbinden der benötigten Klassen und eventuell Konfigurationsdateien

require_once ('config.php');
require_once ('SOAP/Server.php');
require_once ('SOAP/Disco.php');

Der erste Arbeitsschritt ist das Anlegen unserer Klasse CLoginServer mit Funktionen zum Login, Logout und Schreiben einer Session.
Für ein einfaches Beispiel sind ersteinmal ein paar einfache Funktionen vorhanden, die Klasse kann noch nach Belieben um weitere Funktionen wie Userlogging, Fehlerbehandlung etc. erweitert werden.

in unserer Login-Klasse werden erstmal nur 3 Variablen benutzt, für die Userdaten, eine Session-ID und $__dispatch_map für die 'registrierten' Funktionen (dazu später mehr).

var $_aUser = array();
var $_iSessionID = 0;
var $__dispatch_map = array();

im Konstruktor wird eine Datenbankverbindung hergestellt und die Funktionen,
welche über den SOAP-Server von aussen aufgerufen werden können mit der Funktion __dispatch_map 'registriert'
- es wird die 'Signatur' der Funktion definiert, d.h. es werden die zu erwartenden Übergabeparameter und der Rückgabeparameter definiert.

// --| CONSTRUCTOR |------------
function CLoginServer(
) {

mysql_connect(DB_HOST, DB_USER, DB_PASSWORD);
mysql_select_db( DB_NAME );

// definiert die signatur von dispatch map
$this->__dispatch_map['login'] =
array('in'=>array('user'=>'string',
'pass'=>'string',
'userid'=>'varString'),
'out'=>array('outputString'=>'string'),
);
$this->__dispatch_map['logout'] =
array('in'=>array('sessionid'=>'string',
'userid'=>'varString'),
'out' => 0,
);
$this->__dispatch_map['getLastLogin'] =
array('in'=>array('userid'=>'varString'),
'out'=>array('outputString'=>'string'),
);
$this->__dispatch_map['checkLogin'] =
array('in'=>array('sessionid'=>'string'),
'out'=>array('outputString'=>'string'),
);
}//CLoginServer()...

die Funktion __dispatch_map ist weniger aufregend wird aber benötigt, wenn die entsprechende Methode 'registriert' wurde,
wird die 'Signatur' der Methode zurückgegeben.

function __dispatch(
$sMethodname
) {
if (isset($this->__dispatch_map[$sMethodname]))
return $this->__dispatch_map[$sMethodname];
return NULL;
}//__dispatch()...

hier unsere Login-Funktion, wie man sich schon denken kann, geht`s hier um das Login.
Anhand der Übergabeparameter wird hier in der Datenbank kontrolliert, ob korrekte Logindaten übergeben wurden.
Im Erfolgsfall wird eine User-Session in die Datenbank geschrieben, bzw. vorher kontrolliert ob schon eine gültige Session existiert.
Rückgabeparameter: es wird ein Array mit allen Userdaten zurückgegeben.

function login(
$sUser,
$sPass
) {
$sSQL="select * FROM user
WHERE STRCMP(Username,'$sUser')=0 AND
Password=PASSWORD('". $sPass ."')";

$hRes = mysql_query($sSQL) or die(mysql_error());
if( mysql_num_rows($hRes) == 0)
{
return "Login fehlgeschlagen";
}
$this->_aUser = mysql_fetch_array($hRes);

if(!$this->_checkUserSessionExists())
$this->_writeUserSession();

$this->_aUser['SessionID'] = $this->_iSessionID;

return $this->_aUser;
}//login()...

die Funktion _writeUserSession hat einfach nur die Aufgabe die Sessiondaten des Users in eine Datenbanktabelle zu schreiben.
Als Session-ID wird die User-ID mit md5 verschlüsselt gespeichert.

function _writeUserSession(
){
$this->_iSessionID = md5 ($this->_aUser['ID']);
$iSessionTime = time();
$sQuery = "insert into user_session
values('', '". $iSessionTime ."', '".
$this->_aUser['ID'] ."', '".
$this->_iSessionID ."')";
$hRes=mysql_query($sQuery) or die(mysql_error());
}

die Funktion _checkUserSessionExists hat lediglich die Aufgabe zu kontrollieren, ob ein User schon eine gültige Session besitzt.

function _checkUserSessionExists(
){
$this->_iSessionID = md5($this->_aUser['ID']);
$bSessionExists = 0;
$sQuery = "select * from user_session
where Userid ='". $this->_aUser['ID'] ."'
and SessionID='". $this->_iSessionID ."'";
$hRes=mysql_query($sQuery) or die(mysql_error());

if( mysql_num_rows($hRes) != 0)
$bSessionExists = 1;
return $bSessionExists;
}

mit der Funktion checkLogin kann kontrolliert werden, ob noch eine gültige Session existiert,
falls die Session in der Datenbank nicht mehr gültig ist wird diese über logout gelöscht.
Im Erfolgsfall werden die Userdaten zurückgegeben.

function checkLogin(
$sSessionID
) {
$aUserData = array();
$sQuery = "select * from user_session
." inner join user
." on user_session.UserID=user.ID where
user_session.SessionID='".$sSessionID."'";

$hRes = mysql_query($sQuery) or die(mysql_error());
if(mysql_num_rows($hRes) != 0)
{
$aUserData = mysql_fetch_assoc($hRes);
$iTimeOut = (time()-SESSION_TIMEOUT);
if($aUserData['SessionTime']<$iTimeOut)
{
$this->logout($sSessionID,$aUserData['UserID']);
return 0;
}
}
return $aUserData;
}//checkLogin()...

und hier noch eine aufregende Funktion logout - soll es auch geben.
hier wird dann die Session wieder aus der Datenbank gelöscht.

function logout(
$sSessionID,
$iUserID
) {
$sDelete = "delete from user_session where
UserID ='". $iUserID ."'
and SessionID='". $sSessionID ."'";
mysql_query($sDelete) or die(mysql_error());
}//logout()...


Starten des SOAP-Servers:

zuerst wird ein Objekt der Klasse SOAP_Server instantiiert und ein Objekt unserer Klasse CLoginServer.

$oServer = new SOAP_Server();
$oLoginServer = new CLoginServer();

um keine Probleme mit deutschen Sonderzeichen zu bekommen, wird der zu verwendende Zeichensatz festgelegt.

$oServer->response_encoding="ISO-8859-1";

die Instanz unseres Login-Servers muss natürlich auch dem SOAP-Server bekannt gemacht werden.

$oServer->addObjectMap($oLoginServer,'urn:authServer');

nun dafür sorgen, daß Anfragen an den Server immer als POST-Daten behandelt werden.

if(isset($_SERVER['REQUEST_METHOD']) &&
$_SERVER['REQUEST_METHOD']=='POST')
{
$oServer->service($HTTP_RAW_POST_DATA);
}

die folgenden Anweisungen werden benötigt um z.B. auf Anfragen wie http://www.domain.de/soap_server.php?wsdl - mit einer entsprechenden XML-Datei zu antworten.

nachdem eine Instanz des SOAP_DISCO_Server angelegt wurde, wird
der Content-Typ text/xml festgelegt, da hier XML-Dateien ausgegeben werden sollen
und eine entsprechende Funktion des SOAP_DISCO_Servers aufgerufen.

else
{
$oDisco=new SOAP_DISCO_Server($oServer,'TestServer');
header("Content-type: text/xml");
if(isset($_SERVER['QUERY_STRING']) &&
strcasecmp($_SERVER['QUERY_STRING'],'wsdl') == 0)
{
echo $oDisco->getWSDL();
}
else
{
echo $oDisco->getDISCO();
}
}



das komplette Script gibt es auch hier.

im Folgenden wird auf Basis des SOAP-Login-Servers der Aufruf der Funktionen am Beispiel von Login und Logout beschrieben.

Einbinden der benötigten SOAP-Klasse und instantiieren eines Objektes der Klasse Client

require_once ('SOAP/Client.php');
$oClient=new SOAP_CLIENT('http://www.domain.de/soap_loginserver.php');

Der Aufruf der SOAP-Server-Funktionen wird durch die Client-Funktion call() realisiert. Mit der Funktion call() werden folgende Parameter übergeben: 1. der Server-Funktionsname, 2. erforderliche Übergabeparameter an die Server-Funktion und 3. der im Server festgelegte urn-Name

$aParameter = array( $iSoapSessionId, $iUserId );
$oUser = $oClient->call('logout',
$aParameter,
'urn:authServer');


$aParameter = array($_POST['user'],$_POST['pass'],0);
$oUser = $oClient->call('login',
$aParameter,
'urn:authServer');

Zuletzt editiert:Mittwoch, 28. Juli 2004 15:31
Bookmark setzen!:Zu Google Bookmark hinzufügen.Zu bloglines hinzufügen.Zu Newsgator hinzufügen.Zu FURL hinzufügen.Zu DIGG hinzufügen.Zu Webnews hinzufügen.Zu Netscape hinzufügen.Zu Yahoo MyWeb hinzufügen.Zu spurl.net hinzufügen.Zu diigo hinzufügen.Zu Newsvine hinzufügen.Zu del.icio.us hinzufügen.Zu SIMPIFY hinzufügen.Zu Mister Wong hinzufügen.Zu Linkarena hinzufügen.Zu isio.de hinzufügen.Zu Oneview hinzufügen.Zu yigg.de hinzufügen.Zu reddit hinzufügen.Zu StumbleUpon hinzufügen.Zu Slashdot hinzufügen.Zu Blinklist hinzufügen.Zu Technorati hinzufügen.Zu Blogmarks hinzufügen.Zu Blinkbits hinzufügen.Zu ma.gnolia hinzufügen.Zu smarking.com hinzufügen.Zu Netvouz hinzufügen.Zu co.mments hinzufügen.Zu Connotea hinzufügen.Zu de.lirio.us hinzufügen.

Specials

Bytefresser Specials: Anno 1404

Umfrage

Welches ist Dein Lieblings-Anno?

(151 Stimmen)

1. Ganz klar: Anno 1800!
2. Anno 2205
3. Anno 2070
4. Anno 1404
5. Anno 1701
6. Anno 1503
7. Anno 1602
8. Anno Online

Benutzer-Counter

Besucher gesamt: 1.265.950
Besucher heute: 538
Besucher gestern: 286
Max. Besucher/Tag: 1.578
Gerade online: 28
Max. online: 167
Seiten gesamt: 28.901.787
Aufrufe diese Seite: 104

Tag-Cloud

  Übergabeparameter     signatur     __dispatch_map     bytefresser     client     klasse     methode     server     query_string     sessionid     objekt     login     übergeben     datenbank     __dispatch     userid     funktion     instanz     tutorials     zeichensatz     anfragen     soap_disco_server     aufruf     login-server     postings     soap_server     >array     entwicklung     aufgabe     mittwoch