39

在我的应用程序中,我有一个具有以下结构的“用户”表。

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 中实现逻辑以及现有的登录设施。

谢谢!

4

1 回答 1

52

我建议您引入 an 的概念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表中创建一行。但是,不会有passwordactivation_key并且resetpassword_key涉及。因此,您可能希望将这些字段移动到单独的表中,以便您的users表仅包含核心用户数据,而不包含仅与单个登录机制(用户名/密码)相关的数据。

我希望这是有道理的,并且它为您指明了正确的方向。

/克劳斯

于 2011-01-25T12:27:06.730 回答