最近,在给第三方系统提供http接口,总结一下给第三方系统提供接口,应该需要注意哪些。
鉴权
API密钥身份认证
1.API密钥生成: 为每个三方应用生成唯一的API密钥对(AK/SK),其中AK用于标识应用,SK用于进行签名和加密。
AK:Access Key Id,用于标示用户。
SK:Secret Access Key,是用户用于加密认证字符串和用来验证认证字符串的密钥,其中SK必须保密。
通过使用Access Key Id / Secret Access Key加密的方法来验证某个请求的发送者身份。
2.接口鉴权: 在进行接口调用时,客户端需要使用AK和请求参数生成签名,并将其放入请求头或参数中以进行身份验证。
签名认证
1.分配appId(开发者标识)和appSecret(密钥),给不同的调用方
可以直接通过平台线上申请,也可以线下直接颁发。appId是全局唯一的,每个appId将对应一个客户,密钥appSecret需要高度保密。
2.加入timeStamp(时间戳),以服务端当前时间为准,单位为ms ,5分钟内数据有效
时间戳的目的就是为了减轻DOS攻击。防止请求被拦截后一直尝试请求接口。服务器端设置时间戳阀值,如果服务器时间减请求时间戳超过阀值,表示签名超时,接口调用失败。
3.加入临时流水号nonce,至少为10位 ,有效期内防重复提交。
随机值nonce 主要是为了增加签名sign的多变性,也可以保护接口的幂等性,相邻的两次请求nonce不允许重复,如果重复则认为是重复提交,接口调用失败。
- 针对查询接口,流水号只用于日志落地,便于后期日志核查。
- 针对办理类接口需校验流水号在有效期内的唯一性,以避免重复请求。
通过在接口签名请求参数加上 时间戳timeStamp + 随机数nonce 可以防止 ”重放攻击“
限流
典型的限流算法有:滑动窗口算法、漏斗算法、令牌桶算法,常用的限流工具有阿里的sentinel,单机的限流如google guava 的RateLimiter
安全
- 使用HTTPS协议进行数据传输,以保护通信过程中的数据安全。
- 对敏感数据进行加密传输,例如使用TLS加密算法对敏感数据进行加密
日志
记录第三方接口的出入参,方便排查问题,可以使用MongoDB进行存储,因为MongoDB支持海量存储,支持json格式数据
接口文档
推荐使用swagger2,既可以在线查看,也可以生成离线接口文档
版本控制
要注意向下兼容,兼容之前的老版本,一般接口地址都会带上版本号,如http://ip:port//v1/list , http://ip:port//v2/list**