forked from luyan/epmet-cloud-lingshan
				
			
			You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							75 lines
						
					
					
						
							2.9 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							75 lines
						
					
					
						
							2.9 KiB
						
					
					
				| 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<String> 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; | |
|     } | |
| 
 | |
| }
 | |
| 
 |