Ik heb een probleem met mijn in zend framework gebouwde website. Al een tijd lang heb ik een afgeschermd gedeelte in de site, waarbij de authenticatie via zend framework gaat.
Dit werkt prima, er is ook weinig ingewikkelds aan, na de login form komt men in onderstaand stukje code. Bij een succesvolle login volgt nog een forward naar een andere action
Nu heb ik onlangs en stuk bijgebouwd waardoor gebruikers ook kunnen inloggen via twitter, facebook, linkedin of google. Hierbij maak ik gebruik van OAuth en Openid. De authenticatie bij de 3th parties gaar prima. Wat ik daarna doe is van bijvoorbeeld linkedin het emailadres opvragen, vervolgens zoek ik de gebruiker met dat email adres er bij in mijn eigen database.
Als dat gelukt is wil ik zend auth vertellen dat deze gebruiker ingelogd is. Ik haal daarvoor nu een "truc" uit door zend auth de username en wachtwoord te geven die ik net uit de db heb opgehaald, maar deze keer zonder hash functie.
Hierdoor krijg je dus vrijwel hetzelfde als boevnstaand:
Ook dit werkt prima, maar het vervelende is dat je wanneer je nu van deze login methode gebruik alleen maar ingelogd bent in je huidige tabblad van de browser. Open je een nieuw tabblad en ga je weer naar de site, dan zie deze je weer als niet ingelogd (terwijl de eerste tab gewoon netjes ingelogd blijft).
Ik zie in de cookies ook dat er een 2e phpsesid wordt gegeven.
Iemand enige idee waar ik de fout in ga?
Dit werkt prima, er is ook weinig ingewikkelds aan, na de login form komt men in onderstaand stukje code. Bij een succesvolle login volgt nog een forward naar een andere action
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
| //Voer authenticatie uit tegen database $db = Zend_Registry::get('db'); $values = $form->getValues(); //Maak auth adapter aan voo db table $authAdapter = new Zend_Auth_Adapter_DbTable($db,'st_user','u_username','u_password','MD5(?)'); $authAdapter ->setIdentity($values['user']) ->setCredential($values['password']); //Voer authenticatie uit $auth = Zend_Auth::getInstance(); $result = $auth->authenticate($authAdapter); if (!$result->isValid()) { // Invalid credentials, render de form opnieuw $form->setDescription('Login failed'); $this->view->form = $form; return $this->render('index'); // re-render the login form } else { //Authenticatie succesvol! Sla extra gegevens uit de db row op in de sessie voor gebruik in andere delen van de applicatie $storage = $auth->getStorage(); $storage->write($authAdapter->getResultRowObject(array( 'u_id', 'u_pref_currency_id', 'u_username', 'u_active', 'u_confirmed' ))); |
Nu heb ik onlangs en stuk bijgebouwd waardoor gebruikers ook kunnen inloggen via twitter, facebook, linkedin of google. Hierbij maak ik gebruik van OAuth en Openid. De authenticatie bij de 3th parties gaar prima. Wat ik daarna doe is van bijvoorbeeld linkedin het emailadres opvragen, vervolgens zoek ik de gebruiker met dat email adres er bij in mijn eigen database.
Als dat gelukt is wil ik zend auth vertellen dat deze gebruiker ingelogd is. Ik haal daarvoor nu een "truc" uit door zend auth de username en wachtwoord te geven die ik net uit de db heb opgehaald, maar deze keer zonder hash functie.
Hierdoor krijg je dus vrijwel hetzelfde als boevnstaand:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| //Maak auth adapter aan voor db table $authAdapter = new Zend_Auth_Adapter_DbTable($db,'st_user','u_username','u_password'); $authAdapter ->setIdentity($userdetails->u_username) ->setCredential($userdetails->u_password); //Voer authenticatie uit $auth = Zend_Auth::getInstance(); $result = $auth->authenticate($authAdapter); //Sla extra gegevens uit de db row op in de sessie voor gebruik in andere delen van de applicatie $storage = $auth->getStorage(); $storage->write($authAdapter->getResultRowObject(array( 'u_id', 'u_pref_currency_id', 'u_username', 'u_active', 'u_confirmed' ))); |
Ook dit werkt prima, maar het vervelende is dat je wanneer je nu van deze login methode gebruik alleen maar ingelogd bent in je huidige tabblad van de browser. Open je een nieuw tabblad en ga je weer naar de site, dan zie deze je weer als niet ingelogd (terwijl de eerste tab gewoon netjes ingelogd blijft).
Ik zie in de cookies ook dat er een 2e phpsesid wordt gegeven.
Iemand enige idee waar ik de fout in ga?