Ü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

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

Hibernate und Sleep nach Windows Update verschwunden

~0 Min. LesezeitWindows hats mal wieder gemacht, ein grosses Update, was viele Voreinstellungen einfach wieder …

WordPress Domain Suchen und ersetzen

~0 Min. Lesezeit Es gibt diverse Plugins für WordPress, welche die Datenbank durchsuchen und Domain Vorkommnisse ersetzen. Doch was, wenn das WordPress bereits nicht mehr aufrufbar ist, da eine Umstellung schief ging? Dazu sind Plugins nicht brauchbar. Aus diesem Grund stelle ich meine Domains, mit einem kleinen PHP Skript um, was ich hier vorstelle. Das Skript durchsucht nicht die komplette Datenbank, was viel zu aufwändig …

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.