一.分布式系统的认证授权大致架构
以云音乐系统为例:
注:一般情况下,我们会把认证的部分的接口提取为一个单独的认证服务模块中。
二.单点登录(Single Sign On)
单点登录,Single Sign On,简称为 SSO。
SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。
就比如说淘宝和天猫是两个系统,但有了单点登录统一认证后,我们在登录淘宝后,发现天猫也可以自动登录使用。
这样用户只需要认证一次便可以在多个拥有访问权限的系统服务中访问,提高了用户体验性。这个功能就叫做单点登录。
简单说就是原来每个系统都需要一个认证服务,现在把这些认证服务集中在一个系统服务中统一认证即可。
三.使用JWT(JSON Web Token)
【1】JWT简单说就是一串JSON字符串,一串经过加密的签名密钥,里面包含了用户的身份信息。相比于基于session的传统方法,使用JWT我们可以无状态认证。
【2】传统的基于session的方式是有状态认证,用户登录成功将用户的身份信息存储在服务端,并且加大了服务端的存储压力。
并且校验令牌需要远程请求认证服务,客户端的每次访问都会远程校验,执行性能低,这种方式不适合在分布式系统中应用。
虽然有Session复制、Session黏贴等解决问题的方式,但是并不好用。
【3】使用JWT我们可以无状态认证。JWT能够让资源服务自己校验令牌的合法性将省去远程请求认证服务的成本,提高了性能,并且节省了存储的成本。
用户认证通过后会得到一个JWT令牌,JWT令牌中已经包括了用户相关的信息,客户端只需要携带JWT访问资源服务,资源服务根据事先约定的算法自行完成令牌校验,无需每次都请求认证服务完成授权。
四.引入网关
【1】一般微服务都会使用网关。之前我们是在每个服务中进行认证和授权,而认证部分是每个服务都共有的,完全可以将这个操作放在网关中完成。
在网关中进行用户身份的认证可以将很多非法的请求拦截到微服务之外,这叫做网关认证。
【2】网关的职责:
1、网站白名单维护
针对不用认证的URL全部放行。
2、校验jwt的合法性。
除了白名单剩下的就是需要认证的请求,网关需要验证jwt的合法性,jwt合法则说明用户身份合法,否则说明身份不合法则拒绝继续访问。
【3】网关不负责授权,对请求的授权操作在各个微服务进行,因为微服务最清楚用户有哪些权限访问哪些接口。