对外API支持APP Key 授权鉴权方案
第三方调用对外API,首先需要先申请appKey和appSecret,随后调用api接口的时候需要携带appKey,并使用appSecret加密其他参数生成签名sign,最后服务端验证sign签名合法性
appKey:公匙(相当于账号)
appSecret:私匙(相当于密码)
1.xxx CRM端:
新增一个app key鉴权信息维护模块,可维护AppKey,AppSecret等信息
2.API接口端
-
对外API的通用入参请求参数格式:
json请求参数体中,按照参数key按照 a-z 的字母升序排序(key均为小写字母){
key1:'xxx',
key3:'xxx',
key3:'xxx'
} -
header中的携带以下通用参数信息
appKey:'xxxx',// 通用参数,固定值
sign:'签名', //通用参数
timestamp:'当前时间戳' //通用参数 -
签名sign生成规则
sign = md5(请求参数key升序排序的json请求体字符串+appKey+timestamp)
3.流程图

4.代码,java实现
ApiSignAuth
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ApiSignAuth {
/**
* 是否启用
*
* @return
*/
boolean enable() default true;
}
ApiAuthAspect
@Aspect
@Configuration
@Slf4j
public class ApiAuthAspect {
@NacosValue("${api.sign.open:true}")
private boolean isOpen;
@Pointcut("@annotation(edu.sairobo.web.modules.openapi.annotation.ApiSignAuth)")
public void apiAuth() {
}
@Around("apiAuth()")
public Object around(ProceedingJoinPoint pjp) throws Throwable {
if (!isOpen) {
return pjp.proceed();
}
Object proceed;
MethodSignature signature = (MethodSignature) pjp.getSignature();
Method method = signature.getMethod();
ApiSignAuth apiSignAuth = method.getAnnotation(ApiSignAuth.class);
// 是否验签
if (apiSignAuth != null && apiSignAuth.enable()) {
// 执行验签
OpenApiUtil.executeApiSign(HttpKit.getRequest());
}
proceed = pjp.proceed();
return proceed;
}
}
网友评论