package com.epmet.auth; import com.epmet.commons.tools.exception.EpmetErrorCode; import com.epmet.commons.tools.exception.RenException; import com.epmet.commons.tools.redis.RedisKeys; import com.epmet.commons.tools.redis.RedisUtils; import com.epmet.commons.tools.utils.Md5Util; import com.epmet.commons.tools.utils.Result; import com.epmet.commons.tools.utils.SpringContextUtils; import com.epmet.feign.EpmetCommonServiceOpenFeignClient; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.web.server.ServerWebExchange; /** * md5 认证处理器 */ @Component public class ExtAppMD5AuthProcessor extends ExtAppAuthProcessor { private static Logger logger = LoggerFactory.getLogger(ExtAppMD5AuthProcessor.class); //@Autowired //private EpmetCommonServiceOpenFeignClient commonServiceOpenFeignClient; @Autowired private RedisUtils redisUtils; @Override public void auth(String appId, String token, Long ts, ServerWebExchange exchange) { if (ts == null) { throw new RenException(EpmetErrorCode.OPER_EXTERNAL_APP_AUTH_ERROR.getCode(), "需要传入时间戳参数"); } String secret; if (StringUtils.isBlank(secret = getTokenFromCache(appId))) { throw new RenException(EpmetErrorCode.OPER_EXTERNAL_APP_AUTH_ERROR.getCode(), String.format("根据AppId:%s没有找到对应的秘钥", appId)); } String localDigest = Md5Util.md5(secret.concat(":") + ts); if (!localDigest.equals(token)) { // 调用方生成的摘要跟本地生成的摘要不匹配 throw new RenException(EpmetErrorCode.OPER_EXTERNAL_APP_AUTH_ERROR.getCode(), "签名不匹配,认证失败"); } if (!validTimeStamp(ts)) { logger.error("AccessToken已经超时,请求被拒绝"); throw new RenException(EpmetErrorCode.OPER_EXTERNAL_APP_AUTH_ERROR.getCode(), "AccessToken已经超时,请求被拒绝"); } } /** * 通过APP ID查询对应的秘钥 * * @param appId * @return */ public String getTokenFromCache(String appId) { String secret = (String) redisUtils.get(RedisKeys.getExternalAppSecretKey(appId)); if (StringUtils.isBlank(secret)) { EpmetCommonServiceOpenFeignClient commonService = SpringContextUtils.getBean(EpmetCommonServiceOpenFeignClient.class); Result result = commonService.getSecret(appId); if (!result.success()) { throw new RenException(EpmetErrorCode.OPER_EXTERNAL_APP_AUTH_ERROR.getCode(), result.getInternalMsg()); } secret = result.getData(); redisUtils.set(RedisKeys.getExternalAppSecretKey(appId), secret); } return secret; } }