Über den Author / Internet / Open-Xchange: Single Sign On und Unread Anzeige (PHP)

Open-Xchange: Single Sign On und Unread Anzeige (PHP)

~3 Min. Lesezeit

Sehr einfach, wie kann man ein User welcher sich bereits in einer Applikation eingeloggt hat direkt an den Open Xchange Server weiterleiten, ohne das er sich erneut einloggen muss?
Dies nennt man Single Sign On (SSO) und ist dank der HTTP API welche seit Open Xchange Version 6 verfügbar ist einfach zu bewerkstelligen:

<?php
$server = "dein.oxserver.ch";
$user = "OX6USERNAME";
$pass = "OX6PASS";

$data_to_send = "name=".$user."&password=".$pass;

$fp = fsockopen($server, 80);
fputs($fp, "POST /ajax/login?action=login HTTP/1.1\r\n");
fputs($fp, "Host: ".$server."\r\n");
fputs($fp, "Referer: SMuSSO\r\n");
fputs($fp, "Content-type: application/x-www-form-urlencoded\r\n");
fputs($fp, "Content-length: ". strlen($data_to_send) ."\r\n");
fputs($fp, "Connection: close\r\n\r\n");
fputs($fp, $data_to_send);
while(!feof($fp)) {
	$res .= fgets($fp, 1024);
}
fclose($fp);

$string = explode("session\":\"",$res);
$string = explode("\"",$string[1]);

header('Location: http://".$server."/ajax/login;jsessionid='.$string[0].
'?action=redirect&random='.$string[4]);
?>

Anstelle $user und $password kann auch ein anderer Input verwendet werden, z.B. von der bereits bestehenden Authentifizierung.

Auch kann man mit der HTTP API noch viel mehr machen, zum Beispiel rufe ich über eine PHP Datei ab, ob ich neue Mails empfangen habe und in welchem Posteingang.

<?php
$server = "http://dein.ox6server.ch";
$user = "LoginUser";
$pass = "passwort";

function seite_laden($domain,$post = 'POST',$curlPost = '',$cookie='')
{

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $domain);
    curl_setopt($ch, CURLOPT_HEADER, 1);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    if ($cookie == '') {curl_setopt($ch, CURLOPT_COOKIEJAR, ".cookie/.ox6"); }
    else { curl_setopt($ch, CURLOPT_COOKIEFILE, ".cookie/.ox6"); }

    if ($post == 'POST')
    {
	curl_setopt($ch, CURLOPT_POST, 1);
	curl_setopt($ch, CURLOPT_POSTFIELDS, $curlPost);
    }
    elseif ($curlPost != '') {
	curl_setopt($ch, CURLOPT_HTTPGET, 1);
	curl_setopt($ch, CURLOPT_POST, 1);
	curl_setopt($ch, CURLOPT_POSTFIELDS, $curlPost);
    }
    $data = curl_exec($ch);
    curl_close($ch);

    return $data;
}
function checkinbox($name,$inbox)
{
	global $seite, $web;
	$t = explode("\"".$name."\",",$seite);
	$t = explode("]",$t[1]);
	$t = $t[0];
	if ($t >= '1')
	{
		echo "[".$inbox."] ".$t." Neue";
		if ($t == '1') { echo "s Mail gefunden."; }
		else { echo " Mails gefunden."; }
		echo "\r\n";
	}
	elseif ($t != '0') { exit("Fehler bei ".$inbox." und ".$seite); }
	return true;		
}


// Login
$res = seite_laden($server."/ajax/login?action=login",'POST',"name=".$user."&password=".$pass);
$string = explode("session\":\"",$res);
$string = explode("\"",$string[1]);

/* ========================================*/
// Erstes Postfach
$seite = seite_laden($server."/ajax/folders?action=list&columns=1%2C300%2C311&session=".
$string[0]."&parent=<strong>default1</strong>","GET",'', 1);
checkinbox("Inbox","Postfach1");


//Hier weitere Abfragen einbauen!

/* ========================================*/
seite_laden($server."/ajax/login?action=logout,"POST","session=".$string[0], 1);

unlink(".cookie/.ox6");
?>

Damit das Script funktioniert muss noch ein .cookie Ordner mit 777 Rechten angelegt werden! Dies ist sehr wichtig für die Cookie Verwaltung.

Wie man sieht, habe ich im ersten Script mit fsockopen() und beim 2ten Skript mit curl() gearbeitet. Dies habe ich bewusst gemacht, damit man beide Beispiele zur Hand hat für die eigene Implementierung. Welche man am Ende verwendet spielt keine Rolle.

Selbstverständlich kann man auch Unterordner abfragen z.B. so:

$seite = seite_laden($server."/ajax/folders?action=list&columns=1%2C300%2C311&session=".
$string[0]."&parent=<strong>default1/INBOX</strong>","GET",'', 1);
checkinbox("<strong>Ordernname</strong>","<strong>Anzeigename</strong>");
checkinbox("<strong>Ordernname2</strong>","<strong>Anzeigename2</strong>");
checkinbox("<strong>Ordernname3</strong>","<strong>Anzeigename3</strong>");

Selbstverständlich kann man auch offene Tasks und aktuelle Kalender Einträge so auslesen und ausgeben, doch das würde den Rahmen hier nun sprengen.

Mit ein wenig PHP Wissen, kommt man so einfach an eine Anzeige, ob neue Mails verfügbar sind. Ein kleiner automatisches Reload in den Hintergrund und man hat eine aktualisierte Anzeige.

About Stefan

avatar
Ein männlicher IT Nerd, durchstöbert das Web nach speziellen Gadgets, unentbehrlicher Software und Alles was man im IT Sektor nicht verpassen darf.Immer hilfsbereit wenn Probleme zu lösen sind oder das Unmögliche umgesetzt werden sollte.

Weitere interessante Artikel

PHP Trojaner (Teil 3: Spamsender Infektion)

~1 Min. LesezeitSpam ist ein grosses Problem der heutigen Zeit, doch wer verschickt Spam und …

PHP Trojaner (Teil 2: Uploader Infektion)

~1 Min. LesezeitPHP Trojaner sind beliebt, denn oft werden solche Infektionen übersehen und überstehen Jahre …

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

eMail-Benachrichtigung bei weiteren Kommentaren.
Auch möglich: Abo ohne Kommentar.

This Blog will give regular Commentators DoFollow Status. Implemented from IT Blögg