如何设计用户登录
在Web系统中,用户登录是最基本的功能。要实现用户名+密码登录,很多同学的第一想法就是直接创建一个Users表,包含username和password两列,这样,就可以实现登录了:
id | username | password | name等其他字段 ----+----------+----------+---------------- A1 | bob | a1b23f2c | ... A2 | adam | c0932f32 | ...
现在问题来了,如果要让用户通过第三方登录,比如微博登录或QQ登录,怎么集成进来呢?
以微博登录为例,由于微博使用OAuth2协议登录,所以,一个登录用户会包含他的微博身份的ID,一个Access Token用于代表该用户访问微博的API和一个过期时间。
要集成微博登录,很多童鞋立刻想到把Users表扩展几列,记录下微博的信息:
id | username | password | weibo_id | weibo_access_token | weibo_expires | name等其他字段 ----+----------+----------+----------+--------------------+---------------+---------------- A1 | bob | a1b23f2c | W-012345 | xxxxxxxxxx | 604800 | ... A2 | adam | c0932f32 | W-234567 | xxxxxxxxxx | 604800 | ...
加一个QQ登录Users表就又需要加3列,如果这么扩展下去,改表都得累死,不要说维护代码了。
那怎么才能设计出灵活的登录呢?
不妨换个角度考虑用户登录。当用户以任意一种方式登录成功后,我们读取到的总是Users表对应的一行记录,它实际上是用户的个人资料(Profile),而登录过程只是为了认证用户(Authenticate),无论是本地用密码验证,还是委托第三方登录,这个过程本质上都是认证。
所以,如果把Profile和Authenticate分开,就十分容易理解了。Users表本身只存储用户的Profile:
id | name | birth等其他字段 ----+------+----------------- A1 | Bob | ... A2 | Adam | ...
而通过用户名口令登录可视为一种Authenticate的方式,利用LocalAuth表维护:
id | user_id | username | password ----+---------+----------+----------- 01 | A1 | bob | a1b23f2c 02 | A2 | adam | c0932f32
通过微博登录可视为另一种Authenticate方式,利用OAuth表维护:
id | user_id | weibo_id | weibo_access_token | weibo_expires ----+---------+----------+--------------------+--------------- 11 | A1 | W-012345 | xxxxxxxxxx | 604800 12 | A2 | W-234567 | xxxxxxxxxx | 604800
如果要添加另一种OAuth登录,比如QQ登录,增加一个表就可以了。不过既然大家都是OAuth家族的,不如统一到一个表,给每家起个名字区分就好了:
id | user_id | oauth_name | oauth_id | oauth_access_token | oauth_expires ----+---------+------------+----------+--------------------+--------------- 11 | A1 | weibo | W-012345 | xxxxxxxxxx | 604800 12 | A2 | weibo | W-234567 | xxxxxxxxxx | 604800 13 | A1 | qq | Q-090807 | xxx-xxx-xxx | 86400 14 | A2 | qq | Q-807060 | xxx-xxx-xxx | 86400
如果要增加一种新的登录方式,比如SAML,那就再加一种类型的表。
每一种X-Auth表都存储了用户的登录认证信息,并通过user_id关联到Users表。这样一来,不但登录过程简化了,而且一个用户可以使用多种方式登录。只要登录成功,拿到了user_id,最后读取Users表是为了获得用户的Profile,这样读出来的数据也更安全,因为Users表不包含用户口令,不会因为暴露API而不小心把口令给泄露出去。
建议继续学习:
- python实现自动登录discuz论坛 (阅读:31576)
- 微信扫码登录网页实现原理 (阅读:15586)
- 初探单点登录 SSO (阅读:9283)
- 你会做Web上的用户登录功能吗? (阅读:5567)
- perl的expect使用方法,实现非交互式登录。 (阅读:4479)
- 如何让ssh登录更加安全 (阅读:4473)
- 什么是OpenID?OpenID概念、原理和案例 (阅读:4267)
- 互联网上的单点登录研究 (阅读:3989)
- 为什么要登录? (阅读:3906)
- 产品设计之QQ邮箱登录页与淘宝登录页 (阅读:3422)
扫一扫订阅我的微信号:IT技术博客大学习
- 作者:廖雪峰 来源: 廖雪峰的官方网站
- 标签: 登录
- 发布时间:2015-07-23 13:43:49
- [66] Oracle MTS模式下 进程地址与会话信
- [66] Go Reflect 性能
- [65] 如何拿下简短的域名
- [59] android 开发入门
- [59] 图书馆的世界纪录
- [59] IOS安全–浅谈关于IOS加固的几种方法
- [58] 【社会化设计】自我(self)部分――欢迎区
- [53] 视觉调整-设计师 vs. 逻辑
- [47] 界面设计速成
- [46] 读书笔记-壹百度:百度十年千倍的29条法则