Si Puedo, una utopia

Saltar al contenido
Si Puedo

Cakephp, Software Libre »

Tractis Identity Verifications con el componente Auth de CakePHP

Publicado el Viernes 7 Agosto 2009

Si hace solo unos días comentaba como integrar Tractis Identity Verifications con CakePHP ahora le toca el turno a como usarlo con el componente Auth (sistema de autenticación de usuarios)

Se supone que ya está preparada todo la aplicación para el uso de Auth, solo explicaré los cambios que hay que hacer para poder usarlo con Tractis:

En la tabla de usarios hay que incluir 2 tablas más:

ALTER TABLE `users` ADD `tracdni` VARCHAR(15) NULL ;

y la tabla username (si no estaba)

ALTER TABLE `users` ADD `username` VARCHAR(250) NULL ;

El modulo tractis.php lo he modificado, incluyendo en el la validación de usuario:

function iniciar()
{
    $_GET['api_key'] = API_KEY;
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $_GET);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL, 'https://www.tractis.com/data_verification');
    curl_exec($ch);
    $status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);
if ($status==200) {
$user_data = array(
'name' => $_GET['tractis:attribute:name'],
'dni' => $_GET['tractis:attribute:dni'],
'issuer' => $_GET['tractis:attribute:issuer'],
);
return $user_data;
} else {
return false;
}
}

si no esta logeado busca el usuario con los datos recibidos de tractis en este caso he usado el dni, y si no existe lo crea nuevo con una contraseña aleatoria(__randomString) y lo autoriza

function validartractis($usuario, $auth, $tabla){

if(!$auth->user()):
$user_record =
                $tabla->find('first', array(
                    'conditions' => array('tracdni' => $usuario['dni']),
                    'fields' => array('User.tracdni', 'User.username', 'User.password'),
                    'contain' => array()
                ));

if(empty($user_record)):
$user_record['tracdni'] = $usuario['dni'];
$user_record['realname'] = $usuario['name'];
$user_record['trpassword'] = $this->__randomString();
$user_record['password'] = $auth->password($user_record['trpassword']);

$tabla->create();
$tabla->save($user_record);
endif;

//change the Auth fields
$auth->fields = array('username' => 'tracdni', 'password' => 'password');

//log in the user with tractis credentials
$auth->login($user_record);
endif;
}

private function __randomString($minlength = 20, $maxlength = 20, $useupper = true, $usespecial = false, $usenumbers = true){
        $charset = "abcdefghijklmnopqrstuvwxyz";
        if ($useupper) $charset .= "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        if ($usenumbers) $charset .= "0123456789";
        if ($usespecial) $charset .= "~@#$%^*()_+-={}|][";
        if ($minlength > $maxlength) $length = mt_rand ($maxlength, $minlength);
        else $length = mt_rand ($minlength, $maxlength);
        $key = '';
        for ($i=0; $i<$length; $i++){
            $key .= $charset[(mt_rand(0,(strlen($charset)-1)))];
        }
        return $key;
    }

La llamada a la clase se hace desde el users_controller

function tractis()
 {
 $idtractis = $this->Tractis->iniciar();

 if ($idtractis) {
 $this->Tractis->validartractis($idtractis, $this->Auth, $this->User);
 $this->set('userdata', $idtractis);
 $this->redirect($this->Auth->redirect());
 } else {
 $this->Session->setFlash('Idenficacion no realizada');
 }
 }

incluyendo en el formulario (login.ctp) una llamada a la identificación

echo $form->create(null, array('url' => 'https://www.tractis.com/verifications'));
echo $form->input(null,array('type'=>'hidden', 'name'=>'api_key', 'value'=>API_KEY));
echo $form->input(null,array('type'=>'hidden', 'name'=>'notification_callback', 'value'=>URL_OK));
echo $form->submit('Identificate', array('name'=>'commit'));
// OPCIONAL: el campo public_verification es opcional
echo $form->input(null,array('type'=>'hidden', 'name'=>'public_verification', 'value'=>true));
echo $form->end();

En definitiva, el modulo completo [controllers/components/tractis.php] quedaría de la forma:

/* Constantes */
define('API_KEY', '');
define('URL_OK', '');

class TractisComponent extends Object
{
var $status;

function iniciar()
{
 $_GET['api_key'] = API_KEY;
 $ch = curl_init();
 curl_setopt($ch, CURLOPT_POST, true);
 curl_setopt($ch, CURLOPT_POSTFIELDS, $_GET);
 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
 curl_setopt($ch, CURLOPT_URL, 'https://www.tractis.com/data_verification');
 curl_exec($ch);
 $status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
 curl_close($ch);
 if ($status==200) {
 $user_data = array(
 'name' => $_GET['tractis:attribute:name'],
 'dni' => $_GET['tractis:attribute:dni'],
 'issuer' => $_GET['tractis:attribute:issuer'],
 );
 return $user_data;
 } else {
 return false;
 }
}

function validartractis($usuario, $auth, $tabla){

 if(!$auth->user()):
 $user_record =
 $tabla->find('first', array(
 'conditions' => array('tracdni' => $usuario['dni']),
 'fields' => array('User.tracdni', 'User.username', 'User.password'),
 'contain' => array()
 ));

 if(empty($user_record)):
 $user_record['tracdni'] = $usuario['dni'];
 $user_record['realname'] = $usuario['name'];
 $user_record['trpassword'] = $this->__randomString();
 $user_record['password'] = $auth->password($user_record['trpassword']);

 $tabla->create();
 $tabla->save($user_record);
 endif;

 //change the Auth fields
 $auth->fields = array('username' => 'tracdni', 'password' => 'password');

 //log in the user with tractis credentials
 $auth->login($user_record);
 endif;
 }

private function __randomString($minlength = 20, $maxlength = 20, $useupper = true, $usespecial = false, $usenumbers = true){
 $charset = "abcdefghijklmnopqrstuvwxyz";
 if ($useupper) $charset .= "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
 if ($usenumbers) $charset .= "0123456789";
 if ($usespecial) $charset .= "~@#$%^*()_+-={}|][";
 if ($minlength > $maxlength) $length = mt_rand ($maxlength, $minlength);
 else $length = mt_rand ($minlength, $maxlength);
 $key = '';
 for ($i=0; $i<$length; $i++){
 $key .= $charset[(mt_rand(0,(strlen($charset)-1)))];
 }
 return $key;
 }

}

y el [users_controller]

class UsersController extends AppController {

    var $name = "Users";
    var $components = array('Tractis','Auth'); //No es necesario si se declaro en el app controller
    /**
     *  El AuthComponent proporciona la funcionalidad necesaria
     *  para el acceso (login), por lo que se puede dejar esta función en blanco.
     */
    function login() {
    }

function tractis()
    {
		$idtractis = $this->Tractis->iniciar();

		if ($idtractis) {
			$this->Tractis->validartractis($idtractis, $this->Auth, $this->User);
			$this->set('userdata', $idtractis);
			$this->redirect($this->Auth->redirect());
		} else {
			$this->Session->setFlash('Idenficacion no realizada');
		}
    }

	function logout() {
        $this->redirect($this->Auth->logout());
    }

	function beforeFilter()
	{
		$this->Auth->allow("tractis");
		parent::beforeFilter();
}
}

Teneis un ejemplo de uso aqui

4 Comentarios »

  1. Bitacoras.com Dice:

    Agosto 7, 2009 en 10:31 am

    Información Bitacoras.com…

    Valora en Bitacoras.com: Si hace solo unos días comentaba como integrar Tractis Identity Verifications con CakePHP ahora le toca el turno a como usarlo con el componente Auth (sistema de autenticación de usuarios) Se supone que ya está preparada todo…..

  2. Integración de Tractis Identity Verifications con CakePHP [v0.2] | Si Puedo - Accesibilidad, Software Libre y algo más Dice:

    Agosto 7, 2009 en 3:01 pm

    [...] pd: para usar con el componente Auth [...]

  3. Negonation Blog » Blog Archive » Tractis Identity: Autenticación con DNI-e en CakePHP Dice:

    Agosto 7, 2009 en 5:07 pm

    [...] 2009.08.07: Javier Matíes no para. Hoy mismo ha anunciado en su blog la integración de Tractis Identity con el componente Auth de Cake PHP. En otras palabras, ahora dispones de código específico para integrar Tractis Identity con el [...]

  4. Negonation Blog » Blog Archive » Tractis Identity: Integración con el componente Auth de CakePHP Dice:

    Agosto 7, 2009 en 5:19 pm

    [...] integración de Tractis Identity con CakePHP, hoy mismo ha anunciado en su blog la integración de Tractis Identity con el componente Auth de Cake PHP. En otras palabras, ahora dispones de código específico para integrar Tractis Identity con el [...]

Dejar un comentario

El contenido este blog está bajo licencia Creative Commons (Reconocimiento - Compartir igual) - desarrollo javiermaties.com