OAuth(Facebook,Twitter)和基本登录-用户表

16
我想让用户使用他们的Facebook或Twitter账户登录我的网站,如果他们没有账户,则注册一个新账户并使用我的网站的基本登录。但是我的用户表应该是什么样子的:
我的想法:
  • id(主键,自增)
  • username(在oauth登录情况下 => ouath_provider + oauth_id,例如:fb_100001557958700)
  • password(用户选择的密码或在oauth情况下随机生成的密码)
  • name(要显示的名称)
你认为呢?还是我应该有两个表,一个用于基本登录,另一个用于oauth登录?但是这样用户如何获得唯一的ID?
感谢您提前的评论。
2个回答

21

根据我的经验,最好将授权信息存储在一个表中,将用户数据存储在另一个表中。

授权信息:

network     - Varchar(255)  #Twitter/Facebook/Openid/whatever
network_id  - varchar(255)  #Users id for that social network.
user_id     - int

用户:

id (primary, auto increment)
name
password
username

有了这个结构,如果将来想要允许同一用户同时使用Twitter和Facebook登录,也是可以实现的。


2
在OAuth中,用户的用户名和密码是什么?它是空的,还是由系统生成的,或者您的用户必须每次选择一个用户名和密码? - Tamás Pap
3
最好让用户注册一个用户名(可以从OAuth提供者自动填充)和密码。这样,如果用户被锁定了其Twitter或Facebook帐户,你就有了后备方案。 - Gazler
不好意思 @Gazler,关于'user_id'字段怎么处理?在这个上下文中它代表什么?我的意思是,它是指向用户表的外键吗? - Atieh
@Atieh 这是一个旧答案,但是没错 - 它将引用用户的标识符。它可以是同一数据库中的外键(在这种情况下是),但它也可以是另一个数据库中UUID的引用。需要注意的重要事项是,这是您对用户的参考,而不是OAuth提供程序的参考。 - Gazler

4
以下是我用户表的样子。
  • User_id(主键,自动递增)
  • oauth_provider(枚举(none、twitter、facebook))
  • oauth_uid
  • username
  • password
  • etc
每当用户通过Facebook/Twitter注册时,就会插入一个新条目,其中密码记录为空。
我认为这是一个不错的做法,因为您可以在整个应用程序/数据库中使用1个唯一的user_id。

谢谢dandoen。在Facebook/Twitter注册的情况下,用户名是什么?它是null吗? - Tamás Pap
不,当用户使用Facebook/Twitter注册时,他们可能已经有一个用户名。对于Facebook来说,那是username字段,而对于Twitter来说,那是screen_name字段。 - dandoen
1
@dandoen,问题在于只有“本地”的账户才有密码,通过 Twitter 等方式创建的帐户没有密码。这导致数据库中出现了空密码字段,从而可能导致黑客入侵,因为用户名 && 密码 == “”。这需要一个非常强大的代码结构。 - Sliq
1
如果密码字段为空怎么办?SQL的“null = null”比较返回“false”,所以我认为这不会是个问题? - Christopher Francisco

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接