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 Tags: Cakephp, certificado, dni electronico, tractis
El contenido este blog está bajo licencia Creative Commons (Reconocimiento - Compartir igual) - desarrollo javiermaties.com
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…..
Agosto 7, 2009 en 3:01 pm
[...] pd: para usar con el componente Auth [...]
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 [...]
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 [...]