server端数据库设计
用户登录模块在数据库模块也需要好好设计,不能因为每添加一种第三方认证就修改数据库表。
(1)用户基本信息表User
UserID | avatar | name | ... |
---|---|---|---|
2 | url1 | name1 | - |
1 | url2 | name2 | - |
3 | url3 | name3 | - |
用户基本信息表包含一些用户基本信息,主键是用户的UserGuid
,是唯一的。
(2)用户验证表User_auths
primary | UserID | identity_type | identify | credential | isFirstParty |
---|---|---|---|---|---|
1 | 2 | 12345@gmial.com | MD5MD5MD5 | True | |
2 | 2 | account | accountName | accountPwMD5 | True |
3 | 1 | phone | 12345678909 | pwMD5 | True |
4 | 2 | wechatID | access_token & refresh_token | False | |
5 | 3 | weiboID | access_token & refresh_token | False |
用户验证表,包含用户的各种登录方式,对列名解释:primaryKey:主键,唯一。UserGuid:用户唯一标识,在表中不唯一。identity_type:登录方式。identify:该方式的账户名或ID。isFirstParty:是否是第一方登录。credential:对于第一方是密码,对于第三方是access_token
和refresh_token
。
很多现在的APP第三方登录成功获得用户基本资料后便丢弃第三方的
access_token
和refresh_token
,其实如果为了真正的安全,还是需要保存下来,每次自动登录后通过第三方access_token
和refresh_token
来更新用户信息以及验证用户是否是真实身份。UserGuid
不唯一,可能有多个账号对应同一个UserGuid
(第三方绑定到电话账号等等)。使用isFirstParty
来标注是否是第一方,对于有些应用email/phone/accout的密码是同一个,修改的话就需要同时修改,需要通过标志位来定位这些第一方账号。