社交登录实现的数据库结构?

Pra*_*ant 26 php mysql 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 ;
Run Code Online (Sandbox Code Playgroud)

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

谢谢!

Kla*_*sen 32

我建议你介绍一个概念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;
Run Code Online (Sandbox Code Playgroud)

每个登录提供程序都为用户提供唯一的密钥.这存储在ProviderKey.该ProviderType包含哪些登录提供该信息ProviderKey属于,最后,该userId柱连接至该信息users表.因此,当您从其中一个登录提供程序收到成功登录时,您会ProviderKey在表中找到对应的并使用为相关用户设置身份验证cookie.

我不确定你想ProviderType成为一个enum.制作另一个可以容纳这些的表可能更为正确.

例如,当用户首次向您的站点注册并通过Facebook登录时,您必须在users表中创建一行.但是,没有password,activation_key并且resetpassword_key参与其中.因此,您可能希望将这些字段移动到单独的表中,以使您的users表仅包含核心用户数据,而不包含仅与单个登录机制(用户名/密码)相关的数据.

我希望这是有道理的,并指出你正确的方向.

/克劳斯

  • 如果来自Facebook和Twitter的用户拥有相同的密钥怎么办? (2认同)
  • ProviderType可用于区分它们 (2认同)