1、服务鉴权:服务鉴权的流程
用户访问我们的微服务,都需要经过网关作为请求入口,网关对用户身份进行验证,从而保证微服务的安全。但是,大家有没有思考过这样一个问题:
如果你的微服务地址不小心暴露了呢?
一旦微服务地址暴露,用户就可以绕过网关,直接请求微服务,那么我们之前做的一切权限控制就白费了!
因此,我们的每个微服务都需要对调用者的身份进行认证,如果不是有效的身份,则应该阻止访问。
合法的调用者身份,其实就是其它微服务,还有网关。我们首先需要把这些合法的调用者身份存入数据库,并给每一个调用者都设置密钥。接下来的步骤就简单了:当访问某个微服务时,需要携带自己的身份信息,比如密钥
被调用者验证身份信息身份合法
如果验证通过则放行,允许访问
因此,我们必须在一个微服务来管理调用者身份、权限、当然还包括用户的权限,角色等,并对外提供验证调用者身份、查询调用者权限的接口,我们可以再授权中心中完成这些业务。
1)版本1-密码认证
流程图:
加入服务鉴权流程后有没有什么问题呢?
服务调用本来是访问者(client)与微服务(server)之间的交互,但是为了验证身份,不得不与授权中心交互。每次请求都会比原来多一次网络交互,效率大大降低。
能不能只验证一次呢?
2)版本2-令牌认证
如果我们将第一次验证后的身份信息生成一个令牌(token),以后每次请求携带这个token,只要验证token有效,就无需每次调用授权中心验证身份了!
服务调用方需要向授权中心申请令牌,而后每次请求微服务都携带这个令牌即可,而令牌的生成我们依然使用JWT规范来实现。如图:
整个过程是不是跟用户登录也请求服务有点像啊?
没错,其实服务授权,就是把微服务也当做用户来看待。区别在于服务授权无需注册,而是有管理人员提前录入服务及服务的权限信息。
不过这里依然有问题需要思考:请求令牌的动作什么时候做?
令牌过期以后如何生成新令牌?
3)版本3-令牌自动刷新问题1:请求令牌的动作什么时候做?我们肯定不希望频繁去申请令牌,所以应该在项目启动的时候,携带身份信息,去授权中心申请令牌,然后保存起来。
这个可以通过自定义配置类,在配置类中完成令牌的申请和保存,而配置类会在项目启动时加载
问题2:令牌过期以后如何生成新令牌?虽然我们不希望频繁去申请令牌,但是出于安全考虑,令牌最好有一定的过期时间,然后定期更新。
既然是定期更新,当然是定时任务来完成了
如图:
关键的步骤如下:授权中心提供接口:验证身份,签发jwt
所有微服务中通过定时任务,向授权中心发起请求,获取jwt
微服务每次请求都携带jwt在请求头中
被访问服务拦截请求,判断请求头中的jwt身份合法