Page tree
Skip to end of metadata
Go to start of metadata

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 2 Next »

PHP-Datei client.php zum Einbinden
<?php

/**
 *	Ein HTTP-Client in PHP unter Verwendung der curl-Bibliothek für den Zugriff auf die APIs
 *  im SDW-/BiDat-Ökosystem. Sollte im produktiven Einsatz immer SSL-gesichert verwendet werden.
 * 
 *  Autor: Benedikt Wismans
 */

define("opcLogon", 1003);
define("opcLogoff", 1002);

define("httpOK", 200);
define("httpMovedTemp", 302);

//	Der Frontcontroller liegt im geschützten Bereich. Jeder Aufruf dieser URL mit egal was hinten dran verlangt 
//	AUthentifizierung oder eine authentifizierte Session
define("frontcontroller", "/SDW/resources/fc");

//	Die Loginform liegt im public-Bereich. Aufurfe von URLs wie dem Frontcontroller werden bei nicht authtifizierten
//	Session an diese URL weitergeleitet zur Authentifizierung
define("loginform", '/SDW/j_security_check');

/**
 *	Öffnet eine Verbindung zu einem Tomcatcontainer mit container based authentifiaction.
 *  Der Vorgag ist 2 stufig, als 3. Stufe wird dann noch das eigentliche Login gemacht.
 * 
 *  @param	{String}	$url	Die URL fer Servers in der Form http(s)://fqdn:port
 *  @param	{String}	&user	Der Nutzername des Accounts
 *  @param	{String}	&pass	Das Kennwort des Accounts
 *  @param	{Boolean}	$debug	Debug-Flag
 *  @returns {Object}	Ein Assoc Array mit Metadtaen der geoffneten und authentifizierten Session. Muss in folgende requests reingesteckt werden.
 * 
 */
function login($url, $user, $pass, $debug) {
	
	$sessionId = uniqid('', true);
	$cookie='/tmp/'.$sessionId;
	
	//	stage 1: call protected ressource: Frontcontroller with Opcode Login
	$curl = curl_init();
	curl_setopt_array($curl, array(
		CURLOPT_COOKIESESSION => 1,
		CURLOPT_RETURNTRANSFER => 1,
    	CURLOPT_URL => $url.frontcontroller.'?opc='.opcLogon,
    	CURLOPT_USERAGENT => 'PHP Request '.$sessionId
	));
    //	Save SdessionCookie JSESSIONID  returned by server
	curl_setopt($curl, CURLOPT_COOKIEJAR, $cookie);
	curl_exec($curl);

	if (curl_errno($curl)) {
		throw new Exception(curl_error($curl), curl_errno($curl));
	}
	$http_code = curl_getinfo($curl, CURLINFO_HTTP_CODE);
	if ($http_code!=httpOK) {
		throw new Exception('HTTP-Response STATUS<>200', $http_code);
	}
	curl_close($curl);
	
	//	stage 2 : send credentials using sessioncookie
	$curl = curl_init();
	
	curl_setopt_array($curl, array(
		CURLOPT_RETURNTRANSFER => 1,
	    CURLOPT_URL => $url.loginform,
	    CURLOPT_USERAGENT => 'PHP Request '.$sessionId,
	    CURLOPT_POST => 1,
	    CURLOPT_HTTPHEADER => array(
			'Content-Type: application/x-www-form-urlencoded; charset=UTF-8',
			'Connection: Keep-Alive'
		)
	));
	//	Put credentail into postbody invisible in logs
	curl_setopt($curl, CURLOPT_POSTFIELDS,'j_username='.urlencode($user).'&j_password='.urlencode($pass));
    //	Send SdessionCookie JSESSIONID  
    curl_setopt($curl, CURLOPT_COOKIEFILE, $cookie);
	curl_exec($curl);

	if (curl_errno($curl)) {
		throw new Exception(curl_error($curl), curl_errno($curl));
	}
	$http_code = curl_getinfo($curl, CURLINFO_HTTP_CODE);
	if ($http_code!=httpMovedTemp) {
		throw new Exception('HTTP-Response STATUS<>302', $http_code);
	}
	curl_close($curl);

	//	stage 3: call protected ressource again which is now accessible due to 302:moved temporarily
	$curl = curl_init();
	curl_setopt_array($curl, array(
		CURLOPT_RETURNTRANSFER => 1,
    	CURLOPT_URL => $url.frontcontroller.'?opc='.opcLogon,
    	CURLOPT_USERAGENT => 'PHP Request '.$sessionId
	));

    //	Send SdessionCookie JSESSIONID  
    curl_setopt($curl, CURLOPT_COOKIEFILE, $cookie);
    //	Session has changed after logon due to security issue so save new cookie
    curl_setopt($curl, CURLOPT_COOKIEJAR, $cookie);

	$longonInfo=curl_exec($curl);

	if (curl_errno($curl)) {
		throw new Exception(curl_error($curl), curl_errno($curl));
	}
	$http_code = curl_getinfo($curl, CURLINFO_HTTP_CODE);
	if ($http_code!=httpOK) {
		throw new Exception('HTTP-Response STATUS<>200', $http_code);
	}
	curl_close($curl);

	//	convert result from JSON to assoc array and add session infos
	$sessionInfo=json_decode($longonInfo, true);
	$sessionInfo ['sessionId'] = $sessionId;
	$sessionInfo ['cookie'] = $cookie;
	$sessionInfo ['url'] = $url;
	$sessionInfo ['user'] = $user;
	$sessionInfo ['pass'] = "";

	if ($debug) showResponse($sessionInfo);

	return $sessionInfo;
}

/**
 * LogOff. Abmelden vom System und dadurch kill der Session.
 * Ruft nur Get mit dem richtigen Opcode auf
 * @param	{Object}	$sessionInfo	Assoc Array, wird nach dem erfolgreichen Anmelden erzeugt, siehe login
 * @param	{Boolean}	$debug			Debug-Flag für Bildschirmausgaben
 * @returns	{Object}	Das Ergebnis des requests, ein JOSN-Objekt das als Assoc Array zurückgegeben wird
 */
function logoff($sessionInfo, $debug) {
	return get($sessionInfo, opcLogoff, null, $debug);	
}

/**
 *	Get-Methode im Rahmen der geöffneten Session. 
 * 
 *  Wirft Exceptions falls der request schiefläuft. Falls die Session nicht authentifiziert ist wird
 *  der Aufurf vom Tomcat stillschweigend an die Login-Seite verwiesen. Das sollte also nicht passieren.
 * 
 * @param	{Object}	$sessionInfo	Assoc Array, wird nach dem erfolgreichen Anmelden erzeugt, siehe login
 * @paeam	{OPCODE}	$opcode			Long. Der Opcode für den request
 * @param	{Object}	$params			Assoc Array mit Parametern fpr die URL analog zum get-Aufruf
 * @param	{String}	$data			JSON-Objekt als String, die Payload für den Postbody
 * @param	{Boolean}	$debug			Debug-Flag für Bildschirmausgaben
 * @returns	{Object}	Das Ergebnis des requests, ein JOSN-Objekt das als Assoc Array zurückgegeben wird
 */
function get($sessionInfo, $opcode, $params, $debug) {
	
	$url=$sessionInfo ['url'].frontcontroller.'?opc='.$opcode;
	if ($params) {
		foreach ($params as $name => $value) {
			$url .= "&".urlencode($name)."=".urlencode($value);
		}
	}

	$curl = curl_init();
	curl_setopt_array($curl, array(
		CURLOPT_RETURNTRANSFER => 1,
    	CURLOPT_URL => $url,
    	CURLOPT_USERAGENT => 'PHP Request '.$sessionInfo ['sessionId']
	));

    //	Send SdessionCookie JSESSIONID  
    curl_setopt($curl, CURLOPT_COOKIEFILE, $sessionInfo ['cookie']);
    //	Session has changed et least after logon due to security issue so better save new cookie always
    curl_setopt($curl, CURLOPT_COOKIEJAR, $cookie);

	$jsonString=curl_exec($curl);
	
	if (curl_errno($curl)) {
		throw new Exception(curl_error($curl), curl_errno($curl));
	}
	$http_code = curl_getinfo($curl, CURLINFO_HTTP_CODE);
	if ($http_code!=httpOK) {
		throw new Exception('HTTP-Response STATUS<>200', $http_code);
	}
	curl_close($curl);

	if ($debug) showResponse(json_decode($jsonString, true));

	return json_decode($jsonString, true);
}

/**
 *	Post-Methode im Rahmen der geöffneten Session. 
 * 
 *  Wirft Exceptions falls der request schiefläuft. Falls die Session nicht authentifiziert ist wird
 *  der Aufurf vom Tomcat stillschweigend an die Login-Seite verwiesen. Das sollte also nicht passieren.
 * 
 * @param	{Object}	$sessionInfo	Assoc Array, wird nach dem erfolgriechen Anmelden erzeugt, siehe login
 * @paeam	{OPCODE}	$opcode			Long. Der Opcode für den request
 * @param	{Object}	$params			Assoc Array mit Parametern fpr die URL analog zum get-Aufruf
 * @param	{String}	$data			JSON-Objekt als String, die Payload für den Postbody
 * @param	{Boolean}	$debug			Debug-Flag für Bildschirmausgaben
 * @returns	{Object}	Das Ergebnis des requests, ein JOSN-Objekt das als Assoc Array zurückgegeben wird
 */
function post($sessionInfo, $opcode, $params, $data, $debug) {
	
	$url=$sessionInfo ['url'].frontcontroller.'?opc='.$opcode;
	if ($params) {
		foreach ($params as $name => $value) {
			$url .= "&".urlencode($name)."=".urlencode($value);
		}
	}

	$curl = curl_init();
	curl_setopt_array($curl, array(
		CURLOPT_RETURNTRANSFER => 1,
    	CURLOPT_URL => $url,
    	CURLOPT_USERAGENT => 'PHP Request '.$sessionInfo ['sessionId'],
    	CURLOPT_POST => 1,
	    CURLOPT_HTTPHEADER => array(
			'Content-Type: application/x-www-form-urlencoded; charset=UTF-8',
			'Connection: Keep-Alive'
		)
	));

    //	Send SdessionCookie JSESSIONID  
    curl_setopt($curl, CURLOPT_COOKIEFILE, $sessionInfo ['cookie']);
    //	Session has changed et least after logon due to security issue so better save new cookie always
    curl_setopt($curl, CURLOPT_COOKIEJAR, $cookie);
   	//	Put credentail into postbody invisible in logs
	curl_setopt($curl, CURLOPT_POSTFIELDS,'data='.urlencode($data));
    //	Send SdessionCookie JSESSIONID  
	$jsonString=curl_exec($curl);
	
	if (curl_errno($curl)) {
		throw new Exception(curl_error($curl), curl_errno($curl));
	}
	$http_code = curl_getinfo($curl, CURLINFO_HTTP_CODE);
	if ($http_code!=httpOK) {
		throw new Exception('HTTP-Response STATUS<>200', $http_code);
	}
	curl_close($curl);

	if ($debug) showResponse(json_decode($jsonString, true));

	return json_decode($jsonString, true);
}

/**
 *	Doemload-Methode im Rahmen der geöffneten Session um ein File herunterzuladen. 
 * 
 *  Wirft Exceptions falls der request schiefläuft. Falls die Session nicht authentifiziert ist wird
 *  der Aufurf vom Tomcat stillschweigend an die Login-Seite verwiesen. Das sollte also nicht passieren.
 * 
 * @param	{Object}	$sessionInfo	Assoc Array, wird nach dem erfolgriechen Anmelden erzeugt, siehe login
 * @paeam	{OPCODE}	$opcode			Long. Der Opcode für den request
 * @param	{Object}	$params			Assoc Array mit Parametern fpr die URL analog zum get-Aufruf
 * @param	{File}		$file			Geöffneter und zum Schreiben bereiter Filhandle im lokalen Dateisystem
 * @param	{Boolean}	$debug			Debug-Flag für Bildschirmausgaben
 * @returns	{File}		Den Filehandel
 */
function download($sessionInfo, $opcode, $params, $file, $debug) {
	
	$url=$sessionInfo ['url'].frontcontroller.'?opc='.$opcode;
	if ($params) {
		foreach ($params as $name => $value) {
			$url .= "&".urlencode($name)."=".urlencode($value);
		}
	}

	$curl = curl_init();
	curl_setopt_array($curl, array(
		CURLOPT_FILE => $file,
		CURLOPT_TIMEOUT => 20,
    	CURLOPT_URL => $url,
    	CURLOPT_USERAGENT => 'PHP Request '.$sessionInfo ['sessionId']
	));

    //	Send SdessionCookie JSESSIONID  
    curl_setopt($curl, CURLOPT_COOKIEFILE, $sessionInfo ['cookie']);
    //	Session has changed et least after logon due to security issue so better save new cookie always
    curl_setopt($curl, CURLOPT_COOKIEJAR, $cookie);

	curl_exec($curl);
	
	if (curl_errno($curl)) {
		throw new Exception(curl_error($curl), curl_errno($curl));
	}
	$http_code = curl_getinfo($curl, CURLINFO_HTTP_CODE);
	if ($http_code!=httpOK) {
		throw new Exception('HTTP-Response STATUS<>200', $http_code);
	}
	curl_close($curl);

	return $file;
}

/**
 * Helper-Methode für Debugzwecke
 * 
 */ 
function showResponse($response) {
	foreach ($response as $name => $value) {
		echo "$name = $value"."</br>";
	}
}

?>
  • No labels