Si Puedo, una utopia

Saltar al contenido
Si Puedo

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

Integración de Tractis Identity Verifications con CakePHP [v0.2]

Publicado el Jueves 30 Julio 2009

Hace poco que he vuelto a retomar el tema de la identificación con Tractis Identity Verifications gracias a Manolo Ruiz que me lo recordó ;)

Atenea tech ha desarrollado un módulo para poder usarlo con Drupal con el que se puede conectar de una forma muy sencilla, pero yo lo quiero usar con CakePHP, asi que basándome en este he preparado uno para mi framework favorito ;)

El ejemplo lo puedes comprobar en la pagina http://wifi.planetalmeria.com/usuarios/tractis, puedes acceder usando tu certificado. Si no dispones de un certificado puedes descargar uno de pruebas (Password:1111)

La clase usada es esta:

/* Constantes */
define('API_KEY', ''); // consigue tu apikey en https://www.tractis.com/identity_verifications
define('URL_OK', ''); // URL de destino una vez nos hemos identificado

class Tractics
{

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);
 return $status;
}
}

Bastante simple ;) ademas se puede descargar desde aquí, este archivo (tractis.php) se coloca en la carpeta vendors de tu app.

La Api Key de Tractis se consigue registrándose en la página.

Ahora solo es llamarlo en el controller


App::import('Vendor', 'tractis');

class Nombre_del_Controller extends AppController
{
 variables

function tractis()
    {
// Vacio
    }

    function tractisok()
    {
$tractis = new Tractics;
$idtractis = $tractis->iniciar();
if ($idtractis==200) {
$user_data = array(
'tractis' => array(
'name' => $_GET['tractis:attribute:name'],
'dni' => $_GET['tractis:attribute:dni'],
'issuer' => $_GET['tractis:attribute:issuer'],
),
);
$this->set('usuario', $user_data);
} else {
$this->Session->setFlash('Idenficacion no realizada');
}
    }
}

Y en las views:

tractis.ctp


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

y tractisok.ctp


<?php if (isset($usuario)) { ?>
Datos del usuario: <?php print_r($usuario); ?>
<?php } else {?>
Debes <?php echo $html->link('identificarte', '/usuarios/tractis', array('class'=>'add')); ?>
<?php } ?>

y listo.

pd: para usar con el componente Auth

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