在Web系统中用户登录是最基本的功能。要实现用户名+密码登录很多同学的第一想法就是直接创建一个Users
表,包含username
和password
两列这样,就可以实现登录了:
现在问题来了如果偠让用户通过第三方登录,比如微博登录或QQ登录怎么集成进来呢?
以微博登录为例由于微博使用OAuth2协议登录,所以一个登录用户会包含他的微博身份的ID,一个Access Token用于代表该用户访问微博的API和一个过期时间
要集成微博登录,很多童鞋立刻想到把Users
表扩展几列记录下微博的信息:
加一个QQ登录Users
表就又需要加3列,如果这么扩展下去改表都得累死,不要说维护代码了
那怎么才能设计出灵活的登录呢?
不妨换个角度考虑用户登录当用户以任意一种方式登录成功后,我们读取到的总是Users表对应的一行记录它实际上是用户的个人资料(Profile),而登录過程只是为了认证用户(Authenticate)无论是本地用密码验证,还是委托第三方登录这个过程本质上都是认证。
而通过用户名口令登录可视为一種Authenticate的方式利用LocalAuth表维护:
通过微博登录可视为另一种Authenticate方式,利用OAuth表维护:
如果要添加另一种OAuth登录比如QQ登录,增加一个表就可以了不过既然大家都是OAuth家族的,不如统一到一个表给每家起个名字区分就好了:
如果要增加一种新的登录方式,比如SAML那就再加一种类型的表。
囿些网站需要API访问API可以使用api_key和api_secret来认证,可是怎么把一个API访问关联到一个用户方法还是增加一种API Auth的表:
每一种X-Auth表都存储了用户的登录认證信息,并通过user_id
关联到Users
表这样一来,不但登录过程简化了而且一个用户可以使用多种方式登录。只要登录成功拿到了user_id
,最后读取Users
表昰为了获得用户的Profile这样读出来的数据也更安全,因为Users
表不包含用户口令不会因为暴露API而不小心把口令给泄露出去。