在我的应用程序中,我有一个具有以下结构的“用户”表。
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 实现社交登录,就像 Stack Overflow 所做的那样。
最佳答案
我建议你引入 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;
每个登录提供程序都为用户提供一个唯一的 key 。这存储在 ProviderKey
中。 ProviderType
包含有关此 ProviderKey
属于哪个登录提供程序的信息,最后,userId
列将信息与 users
表。因此,当您从其中一个登录提供程序接收到成功登录时,您会在表中找到相应的 ProviderKey
并使用为相关用户设置身份验证 cookie。
我不确定您是否希望 ProviderType
成为 enum
。制作另一个可以容纳这些的 table 可能会更正确。
例如,当用户首次注册您的网站并通过 Facebook 登录时,您必须在 users
表中创建一行。但是,不会涉及 password
、activation_key
和 resetpassword_key
。因此,您可能希望将这些字段移动到单独的表中,以便您的 users
表仅包含核心用户数据,而没有仅与单个登录机制(用户名/密码)相关的数据。
我希望这是有道理的,它为您指明了正确的方向。
/克劳斯
关于php - 社交登录实现的数据库结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4793302/