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<?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"> <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" />
<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;
});
})
<?php if(!isset($_SESSION['email'])){ ?>
<a href="#" id="browserid" title="Sign-in with BrowserID"> <img src="https://browserid.org/i/sign_in_grey.png" alt="Sign in"> <?php } else { echo "hola " . $_SESSION['email']; } ?>
process.php 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(){
$fp = fopen(self::REMOTE_URL, 'rb', false, $ctx);
if ($fp) {
return true;
}
}
/**
* Contruimos la petición HTTP que sera enviada a Mozilla.
*
*/
private function build_query(){
$httpArray = array('assertion' => $this->_assertion
,
$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']);
}
}
?>
Espero que os haya podido ayudar en alguno, para mas información sobre BrowserID:
https://developer.mozilla.org/en/BrowserID/