Si Puedo, una utopia

Saltar al contenido
Si Puedo

Archivos Cakephp

Componente de Autenticación Tractis para CakePHP ya en la web de Tractics

Publicado el Viernes 7 Agosto 2009

Tractis CakePHP

Ya se encuentra en la web de tractis, un enlace al componente además de una entrada en su blog

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

Nuevo Planet

Publicado el Viernes 19 Diciembre 2008

Al final ha podido conmigo python… ( seguro que continuo Luis ;) pero mas adelante)

Bueno, pues eso, que estoy usando un nuevo sistema “propio” (llevaba ya tiempo trabajando en ello) para el planet y es posible que de algunos fallos, si, ya lo se, habiendo tantos sistemas para hacer planet porque no uso uno de ellos… pero o me daban muchos problemas y se repetian muchos post, o no entendia como funcionaban y eso es importante para mi, por si hay problemas saber “atajarlos” cuanto antes.

El nuevo planet esta programado bajo cakephp y usando las librerias de simplepie, los blogs van en una base de datos y la administración ahora mismo lo estoy haciendo desde phpmyadmin (el back-end en cuanto tenga un rato), en este momento estoy con el sistema de caché por lo que la carga es un poquito “alta”… prometo solucionarlo.

Por si alguien está interesado, la aplicación la voy a liberar ;) ¡¡¡¡ aaalaaaa otro sistema más de planet !!! y como nombre habia pensado CPPlanet <- (CakePhp Planet) … os mantendré informados.

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