服务之间的认证,主要包含两部分,一是鉴定真假,二是鉴定篡改。
鉴定真假
在客户端发起请求的时候,添加一个TOKEN字段,服务端接收到请求先校验TOKEN字段是否存在,若存在则认为是合法请求,否则就可以抛出异常中断请求了。
TOKEN在服务端的验证一般有两种处理方式
- 服务端内部保存有TOKEN,直接就可以验证。优点:无需远超调用,节省远超调用开销,加快了处理验证的失效;缺点:TOKEN保存在服务端,意味着TOKEN和服务端强耦合,不够灵活。
- 将TOKEN保存在第三方媒介中,每次处理请求的时候去调用第三方媒介验证。优点:灵活性和可控性更好,可以为不同的客户端分配不同的TOKEN值并设置过期;缺点:远超调用会有一定的开销。
对代码进行修改,主要的改动点:
提供方:
- 定义ProviderTokenFilter过滤器类,实现invoke方法。
- 在invoke方法中,从invocation的attachments中获取TOKEN值,再从上下文中获取方法层面配置的TOKEN值,最后比较两个TOKEN值,一样继续执行业务,不一样则抛出异常直接中断调用流程。
- 在接口所在服务的@DubboService注解中,为改方法添加一个TOEKN参数以及对应的值。
- 将ProviderTokenFilter的类路径添加到META-INF文件夹下面的org.apache.dubbo.rpc.Filter文件中。
消费方:
- 定义一个ConsumerTokenFilter过滤器,实现invoke方法。
- 为调用接口所在的服务的@DubboReference注解中,为该方法添加一个TOKEN参数以及声明该方法需要开启TOKEN认证。
- 在invoke方法中,从上下文中获取方法层面配置的TOKEN值,然后放进invocation的attachments中,跟随远超调用去往提供方。
- 将ConsumerTokenFilter的类路径添加到META_INF文件夹下的org.apache.dubbo.rpc.Filter文件中。
鉴定篡改
鉴定篡改,主要是证明发送的数据在传输过程中没有被偷偷修改,可以考虑加密或加签。
- 加密:把明文变成密文,保护数据在传输过程中信息不泄密。
- 加签:为了验证传输过程中是否被修改。
至于选择加密还是加签,还是两者都使用,要根据实际情况选择,大部分场景舍弃加密处理,采用加签的方式基本就足够了。
代码修改思路:
- 客户端新增一个 ConsumerAddSignFilter 加签过滤器,同样服务端也得增加一个 ProviderVerifySignFilter 验签过滤器。
- 客户端将加签的结果放在 Invocation 的 attachments 里面。
- 服务端获取加签数据时,进行验签处理,若验签通过则放行,否则直接抛出异常。
自定义认证过滤器的通用三部曲:
- 首先,自定义过滤器继承 org.apache.dubbo.rpc.Filter接口,并实现invoke方法,同时在过滤器的@Activate注解中声明是提供方或消费方,还是两者都是。
- 其次,可以在 @Method的parameters字段中为方法自定义一些属性,以辅助过滤器的通用逻辑处理。
- 最后,将自定义过滤器的类路径一定要记得添加到META-INF文件夹下面的org.apache.dubbo.rpc.Filter文件中。
学习来源:极客时间 《Dubbo源码剖析与实战》学习笔记 Day4