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

标签 php mysql

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

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

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

/克劳斯

关于php - 社交登录实现的数据库结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4793302/

相关文章:

php - Kartik select2 小部件在 Yii2 的 Ajax 请求中不起作用?

mysql - 在mysql查询中提及database.table.field总是失败

mysql - 为什么不是所有数据都加载到我的 MySQL 表中?

php - 垂直显示 mysql 表 - 用于比较或打印目的

php - 为我的 MySQL 选择分配 Row_Number

android - Android 的 JDBC 与 Web 服务

php - mysql - 在一个查询中获取显式值和随机值

javascript - 使用 Ajax 如何将表单中的下拉菜单选择值与数据库中的记录相匹配,并获取关联的记录/行以预填充表单?

PHP MySQL 创建表时出错 : Cannot add foreign key constraint

php - ZF2 路由忽略命名空间