2011-01-25 10 views
22

En mi aplicación, tengo una tabla de "usuario" que tiene la siguiente estructura.Estructura de la base de datos para la implementación de inicio de sesión social?

CREATE TABLE IF NOT EXISTS `users` (
    `userId` int(10) unsigned NOT NULL auto_increment, 
    `username` varchar(128) NOT NULL default '', 
    `password` varchar(32) NOT NULL default '', 
    `email` text NOT NULL, 
    `newsletter` tinyint(1) NOT NULL default '0', 
    `banned` enum('yes','no') NOT NULL default 'no', 
    `admin` enum('yes','no') NOT NULL default 'no', 
    `signup_ip` varchar(20) NOT NULL default '', 
    `activation_key` varchar(60) NOT NULL default '', 
    `resetpassword_key` varchar(60) NOT NULL default '', 
    `createdon` datetime NOT NULL default '0000-00-00 00:00:00', 
    PRIMARY KEY (`userId`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=27 ; 

Quiero implementar el inicio de sesión social a través de Facebook, Twitter y OpenID en mi aplicación, al igual que lo hizo StatckOverflow. Por favor, sugiérame qué cambios necesitaré en mi DB y cómo se implementará la lógica en PHP, junto con la instalación de inicio de sesión existente.

Gracias!

Respuesta

23

Yo sugeriría que se introduce el concepto de un AuthenticationProvider:

CREATE TABLE IF NOT EXISTS `AuthenticationProvider` (
`ProviderKey` varchar(128) NOT NULL, 
`userId` int(10) unsigned NOT NULL, 
`ProviderType` enum('facebook','twitter', 'google') NOT NULL, 
PRIMARY KEY (`ProviderKey`)) 
ENGINE=MyISAM DEFAULT CHARSET=latin1; 

Cada proveedor de inicio de sesión proporciona una clave única para el usuario. Esto se almacena en ProviderKey. El ProviderType contiene información sobre a qué proveedor de inicio de sesión pertenece este ProviderKey, y finalmente, la columna userId acopla la información con la tabla users. Por lo tanto, cuando reciba un inicio de sesión exitoso de uno de los proveedores de inicio de sesión, encontrará el correspondiente ProviderKey en la tabla y use establecer la cookie de autenticación para el usuario en cuestión.

No estoy seguro de que quiera que el ProviderType sea un enum. Probablemente sería más correcto hacer otra tabla que pudiera contener esto.

Cuando un usuario se registra por primera vez en su sitio y se registra en Facebook, por ejemplo, tendrá que crear una fila en la tabla users. Sin embargo, no habrá password, activation_key y resetpassword_key involucrados. Por lo tanto, es posible que desee mover esos campos a una tabla separada, de modo que su tabla users solo contenga los datos básicos del usuario, y no datos que solo sean relevantes para un solo mecanismo de inicio de sesión (nombre de usuario/contraseña).

Espero que esto tenga sentido y que lo guíe en la dirección correcta.

/Klaus

+2

¿Qué pasa si el usuario de Facebook y Twitter tiene la misma clave? –

+1

ProviderType se puede utilizar para diferenciarlos –

+0

@EjazKarim, estas claves no son secuenciales, por lo que si la base de datos de Twitter tiene la misma clave para un usuario que la base de datos de Facebook, creo que podemos comenzar a ejecutar. – Machado

Cuestiones relacionadas