Seite 1 von 1

Eingeloggt bleiben nach Authentication Plugin

Verfasst: 28.11.2010 19:53
von Gigagon
Hallo phpBB-Gemeinde,

ich habe versucht ein Authentication Plugin für Contao zu erstellen. Mann kann sich mit einem bestehenden Contao User einloggen und bekommt die Meldung, dass es erfolgreich war. Leider ist man nach dem Klick auf den weiterleitungslink noch nicht, oder nicht mehr eingeloggt.
Im Forum und Internet hab ich nach langen Suchen nichts passendes gefunden.
Muss noch irgendwo ein session gestartet werden?
Ich habe schon versucht, den Inhalt von diesem Thema (klick) einzubinden, aber dann läd es nur noch und es passiert garnichts mehr.

Das ganze läuft auf einem XAMPP bei mir zu hause.

Mein Code sieht im Moment so aus:
(Ich weiss, man kann ihn noch optimieren, aber erstmal ist mir die Funktion an sich wichtig)

Code: Alles auswählen

function login_contao($username, $password) {

	// 1. Den Benutzer in Externer DB-Tabelle finden und auf richtige Daten überprüfen
	$idInContao = findUserInContao($username, $password);

	//Benutzer existiert in Contao
	if($idInContao != -1) {
	
		// 2. Den Benutzer in der DB-Tabelle von phpBB USERS_TABLE finden
		$user_id = findUserInPhpBb($username, $password);
		if($user_id != -1) {
			$status = LOGIN_SUCCESS;
			$error_msg = '';
			$user_row = getUserData($user_id, $password, $username);
		} else {
		
			
			$status = LOGIN_SUCCESS;
			$error_msg = '';
			$user_row = getUserInfoFromContao($username, $password);
		}
		
		//sessionStart($username, $password);
	} else {
		$user_id = findUserInPhpBb($username, $password);
		if($user_id != -1) {
			$status = LOGIN_SUCCESS;
			$error_msg = '';
			$user_row = getUserData($user_id, $password, $username);
			
		} else {	
			$status = LOGIN_ERROR_EXTERNAL_AUTH;
			$error_msg = '';
			$user_row = array('user_id' => ANONYMOUS);
		}
	}
	
	// 3. Meldung zurückgeben
	$rArray = array(
		'status' => $status,
		'error_msg' => $error_msg,
		'user_row' => $user_row);
	
	return $rArray;
}

function sessionStart($username, $password) {
	global $user, $auth;
	// Start session management
	//$user->session_begin();
	//$auth->acl($user->data);
	//$user->setup();


	$autologin = true;
	$viewonline = true;

	$logout  = request_var('mode', '');

	//Wenn username und passwort uebergeben worden sind, starte einen Anmeldeversuch
	if (isset($username) && isset($password)) {
    	$auth->login($username, $password, $autologin, $viewonline);
	}

	//Wenn ueber einen Link der mode=logout lautet und eine SID uebergeben wurde, starte das ausloggen des Users
	if ($logout == 'logout') {
    $user->session_kill();
	}
}


/******************** HILFS-FUNKTIONEN ********************/

function getUserData($user_id, $password, $username) {
	global $db;
	
	$tableName = "phpbb_users";
	$sql = "SELECT *
			FROM ". $tableName ."  
			WHERE user_id =  '". $db->sql_escape($userid) . "'";
	$result = $db->sql_query($sql);
	$row = $db->sql_fetchrow($result);
	$userdata = array('user_id' => $user_id,
								'username' => $username,
								'user_password' => phpbb_hash($password),
								'user_email' => $row['user_email'],
								'group_id' => $row['group_id'],
								'user_type' => $row['user_type']);	
	
	return $userdata;
}

/**
 * Sucht in der User Tabelle von phpBB nach dem Benutzer
 */
function findUserInPhpBb($username, $password) {
	global $db;
	$tableName = "phpbb_users";
	$sql = "SELECT username, user_id
			FROM ". $tableName ."  
			WHERE username =  '". $db->sql_escape($username) . "'";
	$result = $db->sql_query($sql);
	$row = $db->sql_fetchrow($result);
	$usernameInDB = $row['username'];	
	$userIdInDB = $row['user_id'];
	
	$user_id = -1;
	if($username == $usernameInDB) {
		$user_id = $userIdInDB;
	}
	
	return $user_id;
}

/**
 * Sucht in der Tabelle von Contao, ob Benutzer vorhanden und Passwort stimmt.
 * Gibt True zurück, sollte alles stimmen, ansonsten false
 */
function findUserInContao($username, $password) {
	global $db;
	$tableName = "tl_user";
	
	// Verschlüsselung von Contao
	$sql = "SELECT password, id
			FROM ". $tableName ."  
			WHERE username =  '". $db->sql_escape($username) . "'";
	$result = $db->sql_query($sql);
	$row = $db->sql_fetchrow($result);
	$passInDB = $row['password'];
	$idInDB = $row['id'];
	
	// $passInDB = Inhalt aus tl_user "password"
	$tlPassword = explode(":", $passInDB);		// Password und Salt trennen
	$strSalt = $tlPassword[1];					// Salt
	
	// eingegebenes Passwort verschlüsseln
	$strPassword = sha1($strSalt . $password);	// Passwort mit Salt und SHA1 verschlüsseln
	$insertPassword = $strPassword . ':' . $strSalt;		// Passwort und Salt (durch : getrennt)
	
	$user_id = -1;
	if($passInDB == $insertPassword) {
		$user_id = $idInDB;
	}
	
	return $user_id;
}

function getUserInfoFromContao($username, $password) {
	global $db, $user;
	
	$tableName = "tl_user";
	$user_id = findUserInContao($username, $password);
	
	if($user_id != -1) {
		// Verschlüsselung von Contao
		$sql = "SELECT *
				FROM ". $tableName ."  
				WHERE id =  '". $db->sql_escape($user_id) . "'";
		$result = $db->sql_query($sql);
		$row = $db->sql_fetchrow($result);	

	
		
		$user_email = $row['email'];
		$group_id = 1;
		$user_type = 2;
		$user_actkey = md5(rand(0, 100) . time());
		$user_actkey = substr($user_actkey, 0, rand(8, 12));	
		$user_ip = $user->ip;	
		$user_lang = $row['language'];
		$registration_time = $row['dateAdded'];
		$user_inactive_reason = INACTIVE_REGISTER;
 
		// time since the user is inactive. timestamp.
		$user_inactive_time = time();
	
		$user_row = array(
			'username'              => $username,
			'user_password'         => phpbb_hash($password),
			'user_email'            => $user_email,
			'group_id'              => (int) $group_id,
			'user_timezone'         => (float) $timezone,
			'user_dst'              => $is_dst,
			'user_lang'             => $user_lang,
			'user_type'             => $user_type,
			'user_actkey'           => $user_actkey,
			'user_ip'               => $user_ip,
			'user_regdate'          => $registration_time,
			'user_inactive_reason'  => $user_inactive_reason,
			'user_inactive_time'    => $user_inactive_time,
		);		
		
		$user_id = user_add($user_row);
		$user_row['user_id'] = $user_id;
		
		return $user_row;
	} else {
		return null;
	}
}
Ich wäre für jede Hilfe dankbar, denn mit dem Wiki komm ich auch nicht mehr weiter...


Gigagon

Re: Eingeloggt bleiben nach Authentication Plugin

Verfasst: 28.11.2010 20:10
von Pyramide
Falls der Benutzer in phpBB noch nicht existiert, musst du LOGIN_SUCCESS_CREATE_PROFILE (statt LOGIN_SUCCESS) zurückgeben.

Re: Eingeloggt bleiben nach Authentication Plugin

Verfasst: 29.11.2010 21:13
von Gigagon
Hi Pyramide

danke für deinen Tipp, hat mir sehr geholfen und ich habe es soweit geschafft, dass man sich einloggen kann.

Gibt es auch ne Möglichkeit auf die Bearbeitung eines Benutzerprofiels zu reagieren, sodass ich die Daten z.B. in eine andere Tabelle schreiben kann?