[ZF] prefilled zend_auth login is niet persistent

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • AtlonXP1800
  • Registratie: Augustus 2001
  • Laatst online: 29-01 12:01
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


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?

Acties:
  • 0 Henk 'm!

  • ReenL
  • Registratie: Augustus 2010
  • Laatst online: 14-09-2022
Allereerst wil ik even kwijt dat md5 echt niet meer kan anno 2011, maar dat is een andere discussie.

In mijn ogen maak je een denkfout door 2 keer de DbTable auth adapter te willen gebruiken, want dit is gewoon een hack. Hiervoor zal je een andere, danwel een zelfgeschreven adapter moeten gebruiken die het OAuth gedeelte afhandeld.

Welnu, eindelijk ontopic:
- Welke browser gebruik je?
- Maak een lege pagina, gebruik Zend_Session en kijk of hij dan wel in beide tabs werkt.

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Het hele mooie aan OAuth & OpenId is dat jij geen username/password hoeft op te slaan, ga er dan niet omheen werken. Je hoeft alleen een eigen adapter te maken die de login controleert bij de 3e partij, in t geval van OpenID krijg je een url terug (het OpenID) waarop je in je tabel kunt zoeken, vind je een hit dan is die record ingelogd. Bij OAuth kun je t best met userid's werken omdat de username niet perse vast is. Daarvoor geldt t zelfde, sla lekker het netwerk+userid op van iemand en probeer daar een hit op te vinden.

Eens met ReenL: MD5 kan echt niet meer, pak op z'n minst SHA256 met een salt imo.

Acties:
  • 0 Henk 'm!

  • AtlonXP1800
  • Registratie: Augustus 2001
  • Laatst online: 29-01 12:01
Cartman! schreef op dinsdag 09 augustus 2011 @ 08:35:
Het hele mooie aan OAuth & OpenId is dat jij geen username/password hoeft op te slaan, ga er dan niet omheen werken. Je hoeft alleen een eigen adapter te maken die de login controleert bij de 3e partij, in t geval van OpenID krijg je een url terug (het OpenID) waarop je in je tabel kunt zoeken, vind je een hit dan is die record ingelogd. Bij OAuth kun je t best met userid's werken omdat de username niet perse vast is. Daarvoor geldt t zelfde, sla lekker het netwerk+userid op van iemand en probeer daar een hit op te vinden.

Eens met ReenL: MD5 kan echt niet meer, pak op z'n minst SHA256 met een salt imo.
Goed idee, door een eigen zend_auth_adapter te maken en het twitter authenticate deel daar in af te handelen wordt in ieder geval mijn controller een stuk netter, bovendien ben ik dan van die lelijke hack af waar ik nu het username en wachtwoord door geef aan de standaard zend_auth. Ik ga daar eerst eens mee aan de slag.

Trouwens helemaal eens met het MD5 commentaar :)

[ Voor 3% gewijzigd door AtlonXP1800 op 09-08-2011 21:22 ]