美文网首页
API接口AOP验签

API接口AOP验签

作者: 炒面Z | 来源:发表于2019-11-19 15:13 被阅读0次

对外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.流程图


image.png

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;
    }
}



相关文章

网友评论

      本文标题:API接口AOP验签

      本文链接:https://www.haomeiwen.com/subject/olowictx.html