商户拦截器

2.0.0开始支持

商户拦截器又称签名/验签拦截器,对部分请求需要通过签名方式来验证请求安全性。

拦截地址配置

配置后,对需要验证的地址进行验证拦截

  • enabled:是否启用拦截器,默认不启用false
  • url:需要拦截的地址,多个逗号分隔,默认/**

url匹配规则:

  • 模糊匹配:可以通过/**/*模糊匹配所有的地址
wueasy:
  gateway:
    interceptor:
      merchant:
        enabled: true #是否启用,默认false
        url: #需要拦截的地址,多个逗号分隔

商户配置

需要配置商户的信息,merchant中可以配置多个。

  • appId:应用id
  • appSecret:应用密钥(建议32位随机字符串,可以使用uuid
  • name:商户的名称
  • timeVerify:是否启用时间验证,默认false,例如:现在重复请求一小时之前的数据,提示请求过期
  • timeInterval:时间验证区间,秒,默认30分钟,启用时间验证后有效
  • oneVerify:是否请求一次有效,默认false,解决一次消息重复多次的问题,需要配置redis
  • oneTimeInterval:一次请求的验证时间,秒,默认1小时
  • encrypt:签名加密方式,默认SHA1,可选值 MD2,MD5,SHA1,SHA256,SHA384,SHA512,SHA3_224,SHA3_256,SHA3_384,SHA3_512,SHA512_224,SHA512_256; 3.4版本新增
wueasy:
  gateway:
    merchant:
    - appId: test #应用id
      appSecret: 11e1ebfd58254b84a6f3c1d81d27a562 #应用密钥
      name: 测试 #商户名称
      timeVerify: false #是否启用时间验证,默认false
      timeInterval: 1800 #时间验证区间,秒,默认30分钟
      oneVerify: false #是否请求一次有效,默认false
      oneTimeInterval: 3600 #一次请求的验证时间,秒,默认1小时

redis配置

由于一次请求有效是通过reids进行存储验证的,所以如果启用oneVerify,就需要配置对应的商户redis,配置必须为merchant

wueasy :
  data:
    redis: #redis配置
      merchant: #商户配置
        database : 1 #数据库索引(默认为0)
        host : 127.0.0.1 #服务器地址
        port : 6379 #服务器连接端口
        password : 123456  #服务器连接密码(默认为空)
        pool : #连接池配置
          maxIdle : 8 # 连接池中的最大空闲连接,默认值也是8。
          minIdle : 0 #连接池中的最小空闲连接,默认值也是0。
          maxTotal : 2000 # 如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽)。
          maxWaitMillis : 1000 # 等待可用连接的最大时间,单位毫秒,默认值为-1,表示永不超时。如果超过等待时间,则直接抛出JedisConnectionException
        timeout : 3000 #连接超时时间(毫秒)

客户端签名demo

需要传入的参数

参数名 必选 类型 说明
appId string 应用id
randomStr string 随机字符串
timestamp long 时间戳,毫秒
data string 业务参数(对json字符串进行base64加密)
sign string 签名后的值

java签名demo

String APP_ID = "test"; //应用id
String APP_SECRET = "11e1ebfd58254b84a6f3c1d81d27a562";//应用密钥,需要保密,不能传入参数

String randomStr = UUID.randomUUID().toString();//随机字符串

Long timestamp =System.currentTimeMillis();//时间戳,毫秒

DataMap paramMap = new DataMap();
paramMap.set("name", "wueasy");

String data = Base64Helper.encode(JsonHelper.toJSONString(paramMap));//业务参数

String signStr = "appId="+APP_ID+"&randomStr="+randomStr+"&timestamp="+timestamp+"&appSecret="+APP_SECRET+"&data="+data;//签名字符串

System.out.println(signStr);
//获取签名后的内容值,使用sha1加密
String sign = DigestUtils.sha1Hex(signStr);
System.err.println(sign);

重要说明

appSecret作为加密的密钥,一定不能暴露在接口参数中。 最好客户端业务代码进行加密/解密操作,并且混淆代码,提高安全性。

Copyright © wueasy.com 2017-2020 all right reserved,powered by Gitbook未经允许,禁止以任何形式传播 修订时间: 2020-06-24

results matching ""

    No results matching ""