2011-01-25 52 views
22

在我的应用程序中,我有一个“用户”表,它具有以下结构。社交登录实现的数据库结构?

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 ; 

我想通过facebook,twitter和openid在我的应用程序中实现社交登录,就像StatckOverflow一样。请向我建议我在数据库中所需的所有更改以及如何在PHP中实现逻辑以及现有登录设施。

谢谢!

回答

23

我建议你介绍一个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; 

每个登录提供商为用户提供了一个独特的密钥。这存储在ProviderKeyProviderType包含有关此ProviderKey属于哪个登录提供程序的信息,最后,userId列将信息与users表耦合。因此,当您从某个登录提供商处收到成功的登录信息时,可以在表中找到相应的ProviderKey,并使用该用户的身份验证Cookie设置。

我不确定您希望ProviderTypeenum。制作另一张可以容纳这些表格的表格可能更为正确。

当用户首先向您的站点注册并通过Facebook登录时,您将不得不在users表中创建一行。但是,不会涉及password,activation_keyresetpassword_key。因此,您可能希望将这些字段移到单独的表中,以便您的users表只包含核心用户数据,并且没有仅与单一登录机制(用户名/密码)相关的数据。

我希望这是有道理的,它指出你在正确的方向。

/Klaus

+2

如果来自Facebook和Twitter的用户具有相同的密钥,该怎么办? – 2015-06-01 13:53:23