Mediawiki SSO Login
10.3.2008Ich hatte das Problem zu lösen, dass neue Aktivmitglieder jeweils eine Email Adresse erhalten und Zugriff auf Webseiten mit Logins. Eine elegante Art das einfach zu lösen, ist wenn die Webapplikationen über die Emailadresse prüfen, ob der POP Server das Passwort akzeptiert. Dabei muss der Benutzername exakt der Teil der Emailadresse vor dem @ sein. Die Domain muss die Webapplikation anhängen - sonst könnte sich ja jeder mit beliebiger Email Adressen anmelden.
Für Mediawiki erlaubt über AuthPlugin Autentifizierung über einen IMAP Mailserver, LDAP oder viele andere Systeme. Auch ein Plugin um gegen eine Drupal-Installation zu authentifizieren existiert. Ich brauchte ein Plugin für POP3 und habe dazu das IMAP Plugin so angepasst, dass eine Socket Verbindung mit dem POP3 Server aufgebaut wird.
Will man, dass lokale angelegte User trotzdem noch funktionieren (z.b. Admin...), so muss die Methode strict()
den Wert false
zurückgeben.
Die allgemein nützliche Code Passage für Login zu einem POP3 Server (getestet mit qmail) hier noch zur Info. Ich verwende dabei PEAR net/socket:
/** Check username against pop server
* @param user The username supplied by the user
* @param pass The password supplied by the user
* @param maildomain The domain for your email adresses, that is the part coming after the @
* @param mailserver hostname or ip of the machine serving the emails
* @return true if pop3 server accepted the user/pass, false otherwise.
* NOTE: Lots of die to debug pop3 server misbehaviour. You should remove this once you verified the code is working. Or use decent logging right away...
*/
function authenticate($user, $pass, $maildomain, $mailserver) {
$user = "$user@$maildomain";
require_once('Net/Socket.php');
$socket = new Net_Socket();
$result = $socket->connect($mailserver, 110, false, 3);
if ($result === true) {
if (PEAR::isError($response = $socket->readLine( 8192 ))) {
die($data->getMessage());
}
if (@substr(strtoupper($response), 0, 3) == '+OK') {
// the response begins with '+OK' ...
} else {
$socket->disconnect();
die('Mail server sent '+$response);
}
} else {
$socket->disconnect();
die('Could not connect to mail server');
}
if (PEAR::isError($result = $socket->writeLine("USER $user") )){
die($result->getMessage());
}
if (PEAR::isError( $data = $socket->readLine( 8192 ) ) ) {
die($data->getMessage());
}
if (! strtoupper(substr($data, 0, 3)) == '+OK') {
return false;
}
if (PEAR::isError($result = $socket->writeLine("PASS $pass") )){
die($result->getMessage());
}
if (PEAR::isError( $data = $socket->readLine( 8192 ) ) ) {
die($data->getMessage() );
}
if (! (strtoupper(substr($data, 0, 3)) == '+OK')) {
return false;
}
//if we get here, everything is ok
return true;
}