微服务认证鉴权解决方案
微服务结构示意
服务鉴权示意
微服务架构中推荐采用无状态 API 模式,主要有两种方案比较普遍。其中 OAuth2.0 能够完全满足。此外 JWT 除了不能满足 SSOff(一次登出全部登出) 外,其他都能满足,且是所有方案里最为简便轻巧的一个,可通过搭配 API 网关来满足 SSOff 特性的要求,因此 JWT + API 网关也是一个推荐的方案。
Oauth2
- OAuth2.0 是业内成熟的授权登录解决方案, OA2.0 提供了 4 种授权模式,能够适应多种场景,作为基于令牌的安全系统,可以广泛用于需要统一身份认证和授权的场景。
JWT+API 网关
- JWT(JSON Web Token)是一种简洁的自包含的 JSON 声明规范,因其分散存储的特点而归属于客户端授权模式,广泛用于短期授权和单点登录。由于 JWT 信息是经过签名的,可以确保发送方的真实性,确保信息未经篡改和伪造。但由于其自包含的客户端验签特性,令牌一经签发,即无法撤销,因此单纯采用 JWT 作为统一身份认证和授权方案无法满足帐号统一登出和销毁、帐号封禁和解除这几种类型的需求。
主流认证鉴权的两种方式
API 网关作为服务访问的统一入口,所有用户请求都会过 API 网关,很适合用来做认证鉴权这类切面型服务。网关可以拦截用户请求,获取请求中附带的用户身份信息,调用认证授权中心的服务,对请求者做身份认证,即确认当前访问者确实是其所声称的身份,检查该用户是否有访问该后台服务的权限。
目前主流的认证鉴权方案有 2 种。
第一种是引入 Redis 做分布式会话,即用户登录成功后,将用户身份、权限信息存入 Redis,以一个唯一 ID 作为 Key,并设置信息在 Redis 里的失效时间。这个唯一 ID 的 Key 将返回给客户端,客户端可以放入 Cookie,sessionStorage 等处做本地存储。下次访问的时候,将这个唯一 ID 放入请求参数中一起发送(一般放入 Header)。服务端通过检查 Redis 里有无这个 ID 来判断用户是否登录,获取用户身份和权限信息。客户端如果长时间没有操作,则存储在 Redis 里会话信息过期自动删除。客户端每访问一次服务端,需刷新一次会话信息的过期时间,避免固定过期时间带来的低用户体验。
第二种是 JWT,即 Java Web Token。用户登录成功后,服务端向客户端返回的唯一 ID 不再是无意义的字符串,而是包含了用户身份、权限、失效时间等信息的加密字符串。并且这个字符串包含数字签名,服务端可对这个字符串做数字签名验签,确保该字符串未经篡改和伪造。相比分布式会话方案,JWT 虽省去了 Redis 存储,但是每次访问都要做数字签名验证,增加了 CPU 的资源损耗。