Como utilizar BrowserID

Iniciado por WarGhost, 26 Junio 2012, 14:48 PM

0 Miembros y 1 Visitante están viendo este tema.

WarGhost

BrowserID:

¿Qué es BrowserID? Browser ID es un nuevo servicio implementado por Mozilla, que permite que los usuarios puedan controlar sus accesos a diferentes sitios de manera más segura, ejecutándose las funciones en el mismo navegador y comprobando la identidad de los usuarios en base a criptografía asimétrica.
En internet ya existen otros servicios parecidos como por ejemplo OpenID o sistema de identificación por Facebook.

¿Cuales son las ventajas de BrowserID?

  • Pueden identificarse con la misma cuanta en cualquier sitio que tenga implementado BrowserID.
  • Su registro es muy sencillo, solo tienes que poner email y contraseña, una vez hecho esto verificarla y listo.
  • Funciona perfectamente en cualquier navegador moderno.
  • Gran soporte y mucha documentación ofrecida por Mozilla, esto facilita la vida a todos los desarrolladores.
  • BrowserID protege la privacidad de nuestra actividad en la web, no filtra datos sobre qué sitios visitan los usuarios a ningún otro servidor.

Para el ejemplo que os voy a mostrar es necesario un servidor con apache/php/openSSL y utilizar el framework JQuery.

El ejemplo su basa en dos ficheros, index.php y process.php luego podéis organizarlo como queráis:

Index.php
Código (html4strict) [Seleccionar]
<?php session_start(); ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
   <head>
       <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js" type="text/javascript"></script>
       <script src="https://browserid.org/include.js" type="text/javascript"></script>  

       <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
   <title>Ejemplo BrowserID</title>
   </head>
   
   <body>
       <script type="text/javascript">
           function gotAssertion(assertion) {  
               if (assertion !== null) {  
                   $.ajax({  
                       type: 'POST',  
                       url: 'process.php',  
                       data: { assertion: assertion },  
                           success: function(res, status, xhr) {  
                               if (res === null) {
                                   //loggedOut();  
                               } else {
                                   var oJson = jQuery.parseJSON(res);

                                   if(oJson.status == 'okay'){
                                       switch (oJson.action){
                                           case 'new':
                                               $('#login').html('Bienvenido ' + oJson.email);
                                               break;
                                           case 'old':
                                               $('#login').html('Hola ' + oJson.email);
                                               break;
                                           case 'locked':
                                               $('#login').html('Tu cuenta esta bloqueada ' + oJson.email);
                                               break;
                                           }
                                       } else {
                                           alert('Error');
                                       }
                                   }
                               },  
                               error: function(res, status, xhr) {  
                                   alert("Error de conexion");  
                               }
                           });  
                       } else {  
                           //loggedOut();  
                       }  
                   }  

               $(document).ready(function(){
                   $('#browserid').click(function() {  
                   navigator.id.get(gotAssertion, {allowPersistent: true});  
                   return false;  
               });  
           })
       </script>
       <?php if(!isset($_SESSION['email'])){ ?>
       <div id="login">
           <a href="#" id="browserid" title="Sign-in with BrowserID">  
               <img src="https://browserid.org/i/sign_in_grey.png" alt="Sign in">  
           </a>  
       </div>
       <?php } else { echo "hola " $_SESSION['email']; } ?>
   </body>
</html>


process.php
Código (php) [Seleccionar]
<?php session_start();
    class 
browserID {
        const 
REMOTE_URL 'https://browserid.org/verify';
        
        
/**
          * Datos cifrados de la session.
          * @var string 
          */
        
private $_assertion;
        
        
/**
          * Dominio.
          * @var string 
          */
        
private $_localURL;
        
        
/**
          * Solicitud que se envia a Mozilla.
          * @var array 
          */
        
private $_QueryHTTP;
        
        
/**
          * Respuesta de Mozilla.
          * @var string 
          */
        
private $_RequestJSON;
        
        
/**
         * Contructor principal, define los atributos _assertion y _localURL
         * Una vez definidos carga la solicitud HTTP desde el metodo build_query().
          * 
          * @param string $assertion Datos recibidos por el $_POST.
         * @param string $localURL Dominio en el que estas enviando la solicitud.
         */
        
public function __construct($assertion$localURL){
             
$this->_assertion $assertion;
             
$this->_localURL $localURL;
             
             
$this->build_query();
        } 
        
        
/**
         * Comprueba si fue satisfactoria la indetificación y nos devuelve un booleano.
          * 
         * @return bool retorna true si es correcto.
         */
        
public function get_is_login(){
            if(
$this->_RequestJSON->status == 'okay') return true;
        }
        
        
/**
         * Recogemos la dirección de correo de la indentificación
          * 
         * @return string dirección de correo.
         */
        
public function get_email(){
            if(
$this->get_is_login()===true) return $this->_RequestJSON->email;
        }
        
        
/**
         * Fecha en la que expira la sessión.
          * 
         * @return int retorna la fecha en formato unix.
         */
        
public function get_expire(){
            if(
$this->get_is_login()===true) return $this->_RequestJSON->expires;
        }
        
        
        
/**
         * Cambia el dominio.
          * 
         * @param string $localURL Dominio en el que estas enviando la solicitud.
         */
        
public function set_local_url($url){
            
$this->_localURL $url;
        }
        
        
/**
         * Envia la petición anteriormente creada por el metodo build_query.
         *
         * @param bool retorna true si todo salio correcto.
         */
        
public function set_http_request(){
            
$ctx stream_context_create($this->_QueryHTTP);
            
$fp fopen(self::REMOTE_URL'rb'false$ctx);
            
            if (
$fp) {
                
$result stream_get_contents($fp);
                
$this->_RequestJSON json_decode($result);
                
                return 
true;
            }
        }

        
/**
         * Contruimos la petición HTTP que sera enviada a Mozilla.
          * 
         */
        
private function build_query(){
            
$httpArray =    array('assertion' => $this->_assertion
                                  
'audience'  => urlencode($this->_localURL));
            
            
$data =     http_build_query($httpArray);
            
$this->_QueryHTTP = array('http' => array( 'method'  => 'POST',
                                                       
'content' => $data,
                                                       
'header'  => "Content-type: application/x-www-form-urlencoded\r\n"
                                                                  
"Content-Length: " strlen($data) . "\r\n")
                                      );
        }
    }

    
//Creamos el objeto y damos los argumentos, es importante enviar el dominio correcto.
    
$objBrowserID = new browserID($_POST['assertion'], 'www.tusitioweb.com');
    
    if(
$objBrowserID->set_http_request()){
        if(
$objBrowserID->get_is_login() === true) {
             
//Aqui se tendria que comprobar en nuestra base de datos si existe el usuario o en su defecto, crearlo.
             
$_SESSION['email'] = $objBrowserID->get_email();
             
$_SESSION['assertion'] = $_POST['assertion'];
             
             
$json    = array( 'status' => 'okay',
                               
'action' => 'new',
                               
'email'  => $_SESSION['email']);
        }
        
        echo 
json_encode($json);
    }
?>


Espero que os haya podido ayudar en alguno, para mas información sobre BrowserID: https://developer.mozilla.org/en/BrowserID/
¿Qué culpa tengo yo de tener la sangre roja y el corazón a la izquierda?