设计一个可扩展的用户登录系统(第三方登录)

标签: 设计 扩展 用户 | 发表时间:2016-03-27 13:52 | 作者:caimx
出处:http://www.iteye.com

在Web系统中,用户登录是最基本的功能。要实现用户名+密码登录,很多同学的第一想法就是直接创建一个 Users表,包含 usernamepassword两列,这样,就可以实现登录了:

    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,那就再加一种类型的表。

有些网站需要API访问,API可以使用api_key和api_secret来认证,可是怎么把一个API访问关联到一个用户?方法还是增加一种API Auth的表:

    id | user_id | api_key  | api_secret
----+---------+----------+------------
 11 | A1      | a-012345 | xxxxxxxxxx
 12 | A2      | a-234567 | xxxxxxxxxx

每一种X-Auth表都存储了用户的登录认证信息,并通过 user_id关联到 Users表。这样一来,不但登录过程简化了,而且一个用户可以使用多种方式登录。只要登录成功,拿到了 user_id,最后读取 Users表是为了获得用户的Profile,这样读出来的数据也更安全,因为 Users表不包含用户口令,不会因为暴露API而不小心把口令给泄露出去。



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [设计 扩展 用户] 推荐:

设计一个可扩展的用户登录系统(第三方登录)

- - 企业架构 - ITeye博客
在Web系统中,用户登录是最基本的功能. 要实现用户名+密码登录,很多同学的第一想法就是直接创建一个 Users表,包含 username和 password两列,这样,就可以实现登录了:. id | username | password | name等其他字段 ----+----------+----------+---------------- A1 | bob.

扩展你的用户体验战略

- - 人人都是产品经理
在当今商业社会,“用户体验”(简称UX)已经成为一个产品或服务品质的标志,这对于终端用户来说有着密切的联系和意义. 体包含当用户与产品交互时的所有视觉和感受,这在日常生活中已经很常见. 当听到人们在谈论用户体验时,把用户体验作为消费者与商业营销之间联系的方式,其中包括了市场营销到产品开发,再到销售渠道.

提升用户体验的40个Firefox 4扩展

- Roberto - 博客园-首页原创精华区
我在上一篇文章《硝烟渐浓:Windows下主流浏览器的全面比拼》中提到了Firefox强大的扩展性,并链接了两年前写的文章《提升用户体验的38个Firefox扩展》. 但是我发现这篇发表于百度空间的日志“被”私有了,原因是因为含有某些关键词. 我通读了几遍,改了几个我认为可能是关键字的内容,可是仍是私有状态,搞的我很是莫名其妙.

Chrome扩展为用户带来远程桌面功能

- Tim - Solidot
Google发布了Chrome 远程桌面 BETA,基于浏览器的远程桌面扩展. 这个扩展可以让用户在一台电脑上控制网络中的另一台电脑,只要它们都运行Chrome浏览器. Chrome 远程桌面 BETA支持包括中文在内的数十种语言,支持Windows、Linux、 Mac和Chromebooks,只要输入一个一次性的认证码,用户就可以通过Chrome连接任意两台电脑.

深入NGINX:我们如何设计它的性能和扩展性

- - 博客园_知识库
   英文原文: Inside NGINX: How We Designed for Performance & Scale.   为了更好地理解设计,你需要了解NGINX是如何工作的. NGINX之所以能在性能上如此优越,是由于其背后的设计. 许多web服务器和应用服务器使用简单的线程的(threaded)、或基于流程的(process-based)架构, NGINX则以一种复杂的事件驱动(event-driven)的架构脱颖而出,这种架构能支持现代硬件上成千上万的并发连接.

交互设计,产品设计与用户体验设计

- 章明 - 所有文章 - UCD大社区
交互设计,产品设计和用户体验设计经常被混淆,而实际上完全不是一个概念甚至不是一个纬度的概念;. 一直认为交互设计与互动设计很接近,互动设计这个词更多用在flash设计中,维基百科中的交互设计的定义也证实这个想法:. 交互设计,又称互动设计,(英文Interaction Design, 缩写 IxD 或者 IaD),是定义、设计人造系统的行为的设计领域.

谷歌用户体验设计准则

- 雄杰 - 所有文章 - UCD大社区
Googl用户体验团队致力于创建有用的(useful)、快速的(fast)、简单的(simple)、有吸引力的(engaging)、创新的( innovative)、适合大众的(universal)、有用的(profitable)、漂亮的(beautiful)、值得信赖的(trustworthy)、个性化的(personable)的应用.

浅谈用户引导设计

- Xingye - 所有文章 - UCD大社区
作为163免费邮wap版的交互设计师,每天会收到很多用户反馈,其中一些用户反映:不知如何修改邮箱密码;在写邮件页面找不到“发送”按钮;甚至不知道登录邮箱要填写的用户名是指什么……一些看似简单的操作,对于用户来讲都有可能造成困扰,产生“挫败感”. 而对于一个新产品/新功能而言,用户将要花费比上述情况更多的学习成本去了解熟悉产品.

用户行动轨迹设计杂思

- 青椒 - 所有文章 - UCD大社区
    最近关于LBS是否有泡沫的争论此起彼伏,尤其是对Color模式质疑,甚至传出了国内某某基于Foursquare签到模式的LBS公司要大规模裁员的消息. 毋庸置疑的是,LBS是整个移动互联网的基础应用之一,LBS业务模式尚处于探索期. 不管现在众多的Foursquare、Color、Kuipp们的模式多么不靠谱,其中有多少的泡沫成分,并不代表LBS本身没有美好的未来,当然未来LBS的成功肯定不单纯只依赖于签到、弹性社交、问答等几个简单模式.

如何设计新手用户引导

- Lee - Taobao UED Team
引言:这篇文章是小柒、墨轩、淡月、和我4个人一起工作的成果,在今年9月的STS设计分享会上演讲过一次. 我们的设计分享会一共有4个演讲主题,另外几个话题稍后会陆续在这里和大家见面~. 一个新的网络产品,或者一个全新的功能要想吸引用户的使用兴趣,就需要让用户在刚一接触到的时候能够快速地了解它是什么,能做些什么,并且能马上开始一些简单的操作.