Sign插件

说明

  • Sign插件是Apache ShenYu网关自带的,用来对请求进行签名认证的插件。

插件设置

请参考运维部署的内容,选择一种方式启动shenyu-admin。比如,通过 本地部署 启动Apache ShenYu后台管理系统。

  • shenyu-admin 基础配置 —> 插件管理 —> sign ,设置为开启。如果用户不想使用此功能,请在 admin 后台停用此插件。

    Sign插件 - 图1

插件使用

  • 在网关的 pom.xml 文件中添加 sign 的支持。
  1. <!-- apache shenyu sign plugin start-->
  2. <dependency>
  3. <groupId>org.apache.shenyu</groupId>
  4. <artifactId>shenyu-spring-boot-starter-plugin-sign</artifactId>
  5. <version>${project.version}</version>
  6. </dependency>
  7. <!-- apache shenyu sign plugin end-->

新增 AK/SK

  • shenyu-admin —> 基础配置/认证管理中,点击新增,新增一条 AK/SK 。详情请看:认证管理

网关技术实现

  • 采用 AK/SK 鉴权技术方案。
  • 采用鉴权插件,责任链的模式来完成。
  • 当鉴权插件开启,并配置所有接口鉴权时候生效。

鉴权使用指南

  • 第一步:AK/SK由网关来进行分配,比如分配给你的AK为: 1TEST123456781 SK为:506EEB535CF740D7A755CB4B9F4A1536

  • 第二步:确定好你要访问的网关路径 比如 /api/service/abc

  • 第三步:构造参数(以下是通用参数)

字段描述
timestamp当前时间戳(String类型)当前时间的毫秒数(网关会过滤掉5分钟之前的请求)
path/api/service/abc就是你需要访问的接口路径(根据你访问网关接口自己变更)
version1.0.0目前定为1.0.0 写死,String类型

对上述3个字段进行 key 的自然排序,然后进行字段与字段值拼接最后再拼接上 SK ,代码示例。

第一步:首先构造一个 Map

  1. Map<String, String> map = Maps.newHashMapWithExpectedSize(3);
  2. //timestamp为毫秒数的字符串形式 String.valueOf(LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli())
  3. map.put("timestamp","1571711067186"); //值应该为毫秒数的字符串形式
  4. map.put("path", "/api/service/abc");
  5. map.put("version", "1.0.0");

第二步:进行 Key 的自然排序,然后 KeyValue值拼接最后再拼接分配给你的 SK

  1. List<String> storedKeys = Arrays.stream(map.keySet()
  2. .toArray(new String[]{}))
  3. .sorted(Comparator.naturalOrder())
  4. .collect(Collectors.toList());
  5. final String sign = storedKeys.stream()
  6. .map(key -> String.join("", key, params.get(key)))
  7. .collect(Collectors.joining()).trim()
  8. .concat("506EEB535CF740D7A755CB4B9F4A1536");
  • 你得到的 sign 值应该为:path/api/service/abctimestamp1571711067186version1.0.0506EEB535CF740D7A755CB4B9F4A1536

第三步:进行 MD5 加密后转成大写。

  1. DigestUtils.md5DigestAsHex(sign.getBytes()).toUpperCase()
  • 最后得到的值为:A021BF82BE342668B78CD9ADE593D683

请求网关

  • 假如你访问的路径为:/api/service/abc

  • 访问地址 :http:网关的域名/api/service/abc

  • 设置header头,header头参数为:

字段描述
timestamp1571711067186上述你进行签名的时候使用的时间值
appKey1TEST123456781分配给你的AK值
signA021BF82BE342668B78CD9ADE593D683上述得到的签名值
version1.0.0写死,就为这个值
  • 签名插件会默认过滤 5 分钟之前的请求

  • 如果认证不通过会返回 code401message 可能会有变动。

  1. {
  2. "code": 401,
  3. "message": "sign is not pass,Please check you sign algorithm!",
  4. "data": null
  5. }

签名认证算法扩展