在我的应用程序中,我有一个具有以下结构的“用户”表。
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实现社交登录,就像StackOverflow一样。请向我建议我将对数据库进行哪些更改,以及如何使用现有登录工具在PHP中实现该逻辑。
谢谢!
我建议您介绍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;
每个登录提供者为用户提供唯一的密钥。这存储在ProviderKey
中。 ProviderType
包含有关此ProviderKey
属于哪个登录提供程序的信息,最后userId
列将信息与users
表耦合。因此,当您从其中一个登录提供程序收到成功的登录时,您会在表中找到相应的ProviderKey
,并使用该用户的身份验证cookie进行设置。
我不确定您是否希望ProviderType
成为enum
。制作另一个可以容纳这些表的表可能更正确。
例如,当用户首次在您的网站上注册并通过Facebook登录时,您将必须在users
表中创建一行。但是,将不涉及password
,activation_key
和resetpassword_key
。因此,您可能希望将这些字段移动到单独的表中,以便users
表仅包含核心用户数据,而没有仅与单个登录机制(用户名/密码)相关的数据。
我希望这是有道理的,并且可以为您指明正确的方向。
/克劳斯