本篇的内容是针对 接口签名 的,主要分为什么是接口签名、怎么实现接口签名 以及 怎么用等三个方面的内容!
1. 为什么要接口签名
如何保证 API 接口的安全:在实际的业务开发过程中,经常需要跟第三方 API 对接,那这个时候应该如何设计并保证 API 接口的安全呢?----> 接口签名
2. 什么是接口签名
接口签名: 顾名思义就是通过一些签名的规则,对参数进行签名,然后把签名的信息放在请求头里面。服务端收到客户端的请求之后,同样按照一定的规则,生产对应的签名串,然后跟客户端的签名串进行对比,如果一致就进入业务处理;否则提示签名验证失败。

- appId 表示应用的 ID,与之匹配的是 App Secret(应用的密钥,用于数据的签名加密),不同的对接项目,分配不同的 App
ID 和 App Secret,保证数据的安全; - timestamp 表示时间戳,当请求的时间戳和服务器中的时间戳差距在5分钟之内有效;
- nonce 表示临时的流水号,用于防止重复提交
- signature 表示签名字段,用于判断接口请求是否有效
3. 关键代码实现
3.1 过滤器相关
1、首先定义过滤器类,如下:
// Spring Boot保证接口安全
public class SignFilter implements Filter {
@Resource
private RedisUtil redisUtil;
// 从filter配置中获取sign过期时间
private Long signMaxTime;
private static final String NONCE_KEY = "x-nonce-";
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) servletRequest;
HttpServletResponse httpResponse = (HttpServletResponse) servletResponse;
// 返回完整的URL
System.out.println(httpRequest.getRequestURI());
// 拿到封装后的Request
CacheBodyHttpServletRequest requestWrapper = new CacheBodyHttpServletRequest(httpRequest);
// 构建请求头
RequestHeader requestHeader = new RequestHeader();
requestHeader.setSign(httpRequest.getHeader("X-Sign"));
requestHeader.setNonce(httpRequest.getHeader("X-Nonce"));
String xTime = httpRequest.getHeader("X-Time");
// X-Time为空
if (StringUtils.isEmpty(xTime)) {
this.responseFail(httpResponse, ReturnCode.ILLEGAL_HEADER);
return;
}
// 不为空
requestHeader.setTimestamp(Long.parseLong(xTime));
// 验证请求头是否存在
if (StringUtils.isEmpty(requestHeader.getSign()) || ObjectUtils.isEmpty(requestHeader.getTimestamp()) ||

最低0.47元/天 解锁文章
2939

被折叠的 条评论
为什么被折叠?



