分布式用户认证, 有个简单的称谓就是单点登录, 即一处登录,处处通行.
说详细一点就是,集中的用户统一身份认证和分布的式的用户验证和资源访问控制.
对于小公司而言,提供的服务少,经常用户认证和服务混合在一块儿,体会不到分布式用户认证好处.
随着公司规模的扩大,提供的服务愈来愈多,把用户认证和服务提供拆分开来,实现分布式用户认证,可下降系统的相互依赖性,提升系统的可扩展性.安全
这个方案一般在用户登陆后,把用户信息储存与中心服务器, 同时给客户端一个普通token, 之后访问服务时均以此token识别用户身份. 这个token只是一个hash值,一个惟一的ID,自身不含用户信息,要辨别token的真伪,须要的中心服务器查询,这是一个集中用户认证的方案,简单易用,当可扩展性不高.服务器
JWT,简单的说就是把用户的公开信息和信息的签名合成一个字符串,保证信息没法伪造.详细可参考互联网上的资料。
JWT 和基于hash值的普通token的主要不一样点:架构
以一个社区应用例,功能模块以下:分布式
做为架构设计者,有两个重要的思想:架构设计
对于这个系统,咱们看看用户认证系统如何设计?
抛开传统的登录概念,传统的登录一般只是登录一个地方,访问一种服务.设计
当设计认证系统时,不要想咱们在设计软件系统,就当在设计一个国家,没错一个虚拟的国家.
看看国家的分布式用户认证是怎么运做的?
以美国为例,移民局负责颁发用户签证,而里面的大学,酒店,企业就是各类服务提供者.
这里用户认证和服务提供是分开的.视频
要入境美国,首先得像移民局申请签证.
当用户拿着签证去住酒店时,酒店服务员会查看签证的真伪及有效期.
当用户拿着签证去住企业应聘时,企业会查看签证的真伪及有效期,还有就是权限,若是是旅游签证,对不起,旅游签证不能打工.
注意:签证是由移民局集中发行的,而校验确是分布的.
酒店服务员验证签证时,不会打电话到移民局查询真伪.教程
咱们的用户认证系统,其实只要把这一套机制帮过来便可.
由统一的用户认证系统负责颁发签证,而用户访问各类服务时,持有这个签证就能够了.
用户认证后,咱们能够把用户的公开信息如user id等,还有就是受权信息,好比6个月的视频教程受权,1个月的音乐受权等写到这个签证上,这样用户就可访问各类服务.
JWT 防伪有两类签名机制,一类是基于secretKey的Hash机制,一类是非对称签名机制.
第一类Hash机制,JWT的建立和验证使用同一个秘钥,仅适合公司内部用.对应开放平台,要开放给其余公司使用,须要采用非对称签名机制,这样建立和校验是两个秘钥,保证token的集中发行.token
分布式JWT用户验证的问题的一个问题是,Token 一旦发行,没法注销,只能等其自行失效.
这个不单是JWT的问题,全部可分布式验证的证件都有这个问题,包括身份证,签证,驾照等.
驾照丢了,去管理局注销,但这个注销,不会让丢失的驾照当即失效,除非驾照的验证是集中式的.
这也是为何几乎全部的证件都有一个有效期的缘由.资源
对应JWT,为了保证安全,咱们可使用一个比较短的有效期,同时采用一种以旧换新的机制,确保安全.
这个机制有点相似生活中的驾照年审或者签证延期,即每隔一段时间作一次审查并核发新证,因为不须要人工操做,咱们的这个审查频率提升一些.
Token以旧换新的机制,请参看:
http://www.jianshu.com/p/b4cf771e570e
注:现实生活中,护照和签证有些差异,对于软件系统这个差异就不考虑了,统一当成证实身份的证件.