用于社交登录的数据库结构?

问题描述 投票:29回答:1

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

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中实现该逻辑。

谢谢!

php mysql social
1个回答
36
投票

我建议您介绍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_keyresetpassword_key。因此,您可能希望将这些字段移动到单独的表中,以便users表仅包含核心用户数据,而没有仅与单个登录机制(用户名/密码)相关的数据。

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

/克劳斯

© www.soinside.com 2019 - 2024. All rights reserved.