|  | @ -1,18 +1,19 @@
 | 
	
		
			
				|  |  | package com.yihu.jw.security.oauth2.provider.endpoint;
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | import com.fasterxml.jackson.databind.ObjectMapper;
 | 
	
		
			
				|  |  | import com.yihu.jw.security.model.Captcha;
 | 
	
		
			
				|  |  | import com.yihu.jw.security.model.PublicKey;
 | 
	
		
			
				|  |  | import com.yihu.jw.security.oauth2.core.redis.WlyyRedisVerifyCodeService;
 | 
	
		
			
				|  |  | import com.yihu.jw.security.oauth2.provider.error.WlyyOAuth2ExceptionTranslator;
 | 
	
		
			
				|  |  | import com.yihu.jw.security.oauth2.provider.WlyyTokenGranter;
 | 
	
		
			
				|  |  | import com.yihu.jw.security.core.userdetails.jdbc.WlyyUserDetailsService;
 | 
	
		
			
				|  |  | import com.yihu.jw.security.model.Oauth2Envelop;
 | 
	
		
			
				|  |  | import com.yihu.jw.security.model.WlyyUserSimple;
 | 
	
		
			
				|  |  | import com.yihu.utils.security.RSAUtils;
 | 
	
		
			
				|  |  | import org.apache.commons.codec.binary.Base64;
 | 
	
		
			
				|  |  | import org.slf4j.Logger;
 | 
	
		
			
				|  |  | import org.slf4j.LoggerFactory;
 | 
	
		
			
				|  |  | import org.springframework.beans.factory.annotation.Autowired;
 | 
	
		
			
				|  |  | import org.springframework.http.HttpHeaders;
 | 
	
		
			
				|  |  | import org.springframework.http.HttpStatus;
 | 
	
		
			
				|  |  | import org.springframework.http.ResponseEntity;
 | 
	
		
			
				|  |  | import org.springframework.http.*;
 | 
	
		
			
				|  |  | import org.springframework.security.authentication.AuthenticationManager;
 | 
	
		
			
				|  |  | import org.springframework.security.core.userdetails.UsernameNotFoundException;
 | 
	
		
			
				|  |  | import org.springframework.security.oauth2.common.OAuth2AccessToken;
 | 
	
	
		
			
				|  | @ -24,15 +25,27 @@ import org.springframework.security.oauth2.provider.request.DefaultOAuth2Request
 | 
	
		
			
				|  |  | import org.springframework.security.oauth2.provider.request.DefaultOAuth2RequestValidator;
 | 
	
		
			
				|  |  | import org.springframework.security.oauth2.provider.token.store.redis.RedisTokenStore;
 | 
	
		
			
				|  |  | import org.springframework.util.Assert;
 | 
	
		
			
				|  |  | import org.springframework.util.LinkedMultiValueMap;
 | 
	
		
			
				|  |  | import org.springframework.util.MultiValueMap;
 | 
	
		
			
				|  |  | import org.springframework.util.StringUtils;
 | 
	
		
			
				|  |  | import org.springframework.web.bind.annotation.*;
 | 
	
		
			
				|  |  | import org.springframework.web.client.RestTemplate;
 | 
	
		
			
				|  |  | import org.springframework.web.context.request.RequestContextHolder;
 | 
	
		
			
				|  |  | import org.springframework.web.context.request.ServletRequestAttributes;
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | import javax.annotation.PostConstruct;
 | 
	
		
			
				|  |  | import javax.servlet.http.Cookie;
 | 
	
		
			
				|  |  | import javax.servlet.http.HttpServletRequest;
 | 
	
		
			
				|  |  | import javax.servlet.http.HttpServletResponse;
 | 
	
		
			
				|  |  | import javax.servlet.http.HttpSession;
 | 
	
		
			
				|  |  | import java.io.IOException;
 | 
	
		
			
				|  |  | import java.security.interfaces.RSAPrivateKey;
 | 
	
		
			
				|  |  | import java.security.interfaces.RSAPublicKey;
 | 
	
		
			
				|  |  | import java.text.SimpleDateFormat;
 | 
	
		
			
				|  |  | import java.util.Date;
 | 
	
		
			
				|  |  | import java.util.HashMap;
 | 
	
		
			
				|  |  | import java.util.Map;
 | 
	
		
			
				|  |  | import java.util.UUID;
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | /**
 | 
	
		
			
				|  |  |  * <p>
 | 
	
	
		
			
				|  | @ -64,26 +77,36 @@ public class WlyyLoginEndpoint extends AbstractEndpoint {
 | 
	
		
			
				|  |  |     @Autowired
 | 
	
		
			
				|  |  |     private WlyyUserDetailsService userDetailsService;
 | 
	
		
			
				|  |  |     @Autowired
 | 
	
		
			
				|  |  |     private WlyyRedisVerifyCodeService wlyyRedisVerifyCodeService;
 | 
	
		
			
				|  |  |     private RestTemplate restTemplate;
 | 
	
		
			
				|  |  |     @Autowired
 | 
	
		
			
				|  |  |     private ObjectMapper objectMapper;
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     private WlyyRedisVerifyCodeService wlyyRedisVerifyCodeService;
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     @PostConstruct
 | 
	
		
			
				|  |  |     private void init() {
 | 
	
		
			
				|  |  |         super.setTokenGranter(tokenGranter);
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     /**
 | 
	
		
			
				|  |  |      * 登陆
 | 
	
		
			
				|  |  |      * @param parameters
 | 
	
		
			
				|  |  |      * @param httpSession
 | 
	
		
			
				|  |  |      * @return
 | 
	
		
			
				|  |  |      * @throws Exception
 | 
	
		
			
				|  |  |      */
 | 
	
		
			
				|  |  |     @RequestMapping(value = "/oauth/login", method = RequestMethod.POST)
 | 
	
		
			
				|  |  |     public ResponseEntity<Oauth2Envelop<WlyyUserSimple>> login(@RequestParam Map<String, String> parameters) {
 | 
	
		
			
				|  |  |     public ResponseEntity<Oauth2Envelop<WlyyUserSimple>> login(@RequestParam Map<String, String> parameters, HttpSession httpSession) throws Exception {
 | 
	
		
			
				|  |  |         String client_id = parameters.get("client_id");
 | 
	
		
			
				|  |  |         if (StringUtils.isEmpty(client_id)) {
 | 
	
		
			
				|  |  |             throw new InvalidRequestException("client_id");
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  |         if (StringUtils.isEmpty(parameters.get("verify_code"))) {
 | 
	
		
			
				|  |  |         if (StringUtils.isEmpty(parameters.get("captcha"))) {
 | 
	
		
			
				|  |  |             parameters.put("grant_type", "password");
 | 
	
		
			
				|  |  |             if (parameters.get("password") != null) {
 | 
	
		
			
				|  |  |                 RSAPrivateKey rsaPrivateKey = (RSAPrivateKey)httpSession.getAttribute("privateKey");
 | 
	
		
			
				|  |  |                 parameters.put("password", RSAUtils.decryptByPrivateKey(new String(Base64.decodeBase64(parameters.get("password"))), rsaPrivateKey));
 | 
	
		
			
				|  |  |             }
 | 
	
		
			
				|  |  |         } else {
 | 
	
		
			
				|  |  |             parameters.put("grant_type", "verify_code");
 | 
	
		
			
				|  |  |             parameters.put("grant_type", "captcha");
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |         ClientDetails authenticatedClient = clientDetailsService.loadClientByClientId(client_id);
 | 
	
	
		
			
				|  | @ -118,6 +141,11 @@ public class WlyyLoginEndpoint extends AbstractEndpoint {
 | 
	
		
			
				|  |  |         return getResponse(wlyyUserSimple);
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     /**
 | 
	
		
			
				|  |  |      * 单点登陆第二步 - token验证
 | 
	
		
			
				|  |  |      * @param parameters
 | 
	
		
			
				|  |  |      * @return
 | 
	
		
			
				|  |  |      */
 | 
	
		
			
				|  |  |     @RequestMapping(value = "/oauth/sso", method = RequestMethod.POST)
 | 
	
		
			
				|  |  |     public ResponseEntity<Oauth2Envelop<WlyyUserSimple>> sso(@RequestParam Map<String, String> parameters) {
 | 
	
		
			
				|  |  |         String clientId = parameters.get("client_id");
 | 
	
	
		
			
				|  | @ -154,6 +182,12 @@ public class WlyyLoginEndpoint extends AbstractEndpoint {
 | 
	
		
			
				|  |  |         return getResponse(wlyyUserSimple);
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     /**
 | 
	
		
			
				|  |  |      * 登出
 | 
	
		
			
				|  |  |      * @param parameters
 | 
	
		
			
				|  |  |      * @param request
 | 
	
		
			
				|  |  |      * @return
 | 
	
		
			
				|  |  |      */
 | 
	
		
			
				|  |  |     @RequestMapping(value = "/oauth/logout", method = RequestMethod.POST)
 | 
	
		
			
				|  |  |     public ResponseEntity<Oauth2Envelop> logout(@RequestParam Map<String, String> parameters, HttpServletRequest request) {
 | 
	
		
			
				|  |  |         String token = request.getHeader("token");
 | 
	
	
		
			
				|  | @ -172,112 +206,125 @@ public class WlyyLoginEndpoint extends AbstractEndpoint {
 | 
	
		
			
				|  |  |         return new ResponseEntity<>(oauth2Envelop, headers, HttpStatus.OK);
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     /*@RequestMapping(value = ServiceApi.Authentication.VerifyCode, method = RequestMethod.POST)
 | 
	
		
			
				|  |  |     public ResponseEntity<Envelop> verifyCode(@RequestParam Map<String, String> parameters) throws  Exception{
 | 
	
		
			
				|  |  |         Envelop envelop = new Envelop();
 | 
	
		
			
				|  |  |     /**
 | 
	
		
			
				|  |  |      * 获取公钥
 | 
	
		
			
				|  |  |      * @param httpSession
 | 
	
		
			
				|  |  |      * @param httpServletResponse
 | 
	
		
			
				|  |  |      * @return
 | 
	
		
			
				|  |  |      * @throws Exception
 | 
	
		
			
				|  |  |      */
 | 
	
		
			
				|  |  |     @RequestMapping(value = "/oauth/public_key", method = RequestMethod.GET)
 | 
	
		
			
				|  |  |     public ResponseEntity<Oauth2Envelop<PublicKey>> publicKey (
 | 
	
		
			
				|  |  |             HttpSession httpSession,
 | 
	
		
			
				|  |  |             HttpServletResponse httpServletResponse) throws Exception {
 | 
	
		
			
				|  |  |         //生成公钥和私钥
 | 
	
		
			
				|  |  |         HashMap<String, Object> map = RSAUtils.generateKeys();
 | 
	
		
			
				|  |  |         RSAPublicKey rsaPublicKey = (RSAPublicKey) map.get("public");
 | 
	
		
			
				|  |  |         RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) map.get("private");
 | 
	
		
			
				|  |  |         PublicKey publicKey = new PublicKey();
 | 
	
		
			
				|  |  |         publicKey.setModulus(Base64.encodeBase64String(rsaPublicKey.getModulus().toByteArray()));
 | 
	
		
			
				|  |  |         publicKey.setExponent(Base64.encodeBase64String(rsaPublicKey.getPublicExponent().toByteArray()));
 | 
	
		
			
				|  |  |         httpSession.setAttribute("privateKey", rsaPrivateKey);
 | 
	
		
			
				|  |  |         //生成Cookie
 | 
	
		
			
				|  |  |         Cookie cookie = new Cookie("oauth2", UUID.randomUUID().toString());
 | 
	
		
			
				|  |  |         cookie.setMaxAge(60);
 | 
	
		
			
				|  |  |         cookie.setPath("/oauth");
 | 
	
		
			
				|  |  |         httpServletResponse.addCookie(cookie);
 | 
	
		
			
				|  |  |         HttpHeaders headers = new HttpHeaders();
 | 
	
		
			
				|  |  |         headers.set("Cache-Control", "no-store");
 | 
	
		
			
				|  |  |         headers.set("Pragma", "no-cache");
 | 
	
		
			
				|  |  |         Oauth2Envelop<PublicKey> oauth2Envelop = new Oauth2Envelop<>("public_key", 200, publicKey);
 | 
	
		
			
				|  |  |         return new ResponseEntity<>(oauth2Envelop, headers, HttpStatus.OK);
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     /**
 | 
	
		
			
				|  |  |      * 获取验证码
 | 
	
		
			
				|  |  |      * @param parameters
 | 
	
		
			
				|  |  |      * @return
 | 
	
		
			
				|  |  |      * @throws Exception
 | 
	
		
			
				|  |  |      */
 | 
	
		
			
				|  |  |     @RequestMapping(value = "/oauth/captcha", method = RequestMethod.GET)
 | 
	
		
			
				|  |  |     public ResponseEntity<Oauth2Envelop<Captcha>> captcha(@RequestParam Map<String, String> parameters) throws  Exception{
 | 
	
		
			
				|  |  |         String client_id = parameters.get("client_id");
 | 
	
		
			
				|  |  |         String username = parameters.get("username");
 | 
	
		
			
				|  |  |         if (StringUtils.isEmpty(client_id)) {
 | 
	
		
			
				|  |  |             throw new InvalidRequestException("client_id");
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  |         if (StringUtils.isEmpty(username)){
 | 
	
		
			
				|  |  |             envelop.setSuccessFlg(false);
 | 
	
		
			
				|  |  |             envelop.setErrorMsg("手机号码【"+username+"】不能为空!");
 | 
	
		
			
				|  |  |             return new ResponseEntity<>(envelop, headers, HttpStatus.OK);
 | 
	
		
			
				|  |  |             throw new InvalidRequestException("username");
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  |         VerifyCode verifyCode = new VerifyCode();
 | 
	
		
			
				|  |  |         //手机短信验证码
 | 
	
		
			
				|  |  |         RandomUtil randomUtil = new RandomUtil();
 | 
	
		
			
				|  |  |         String random = randomUtil.getRandomString(6);
 | 
	
		
			
				|  |  |         //发送短信
 | 
	
		
			
				|  |  |         String api = "MsgGW.Sms.send";
 | 
	
		
			
				|  |  |         String content = "尊敬的用户:欢迎使用健康上饶,您的验证码为:【" + random + "】,有效期10分钟,请尽快完成注册。若非本人操作,请忽略。";
 | 
	
		
			
				|  |  |         Map<String, String> apiParamMap = new HashMap<>();
 | 
	
		
			
				|  |  |         //手机号码
 | 
	
		
			
				|  |  |         apiParamMap.put("mobile", username);
 | 
	
		
			
				|  |  |         //业务标签
 | 
	
		
			
				|  |  |         apiParamMap.put("handlerId", fzHandlerId);
 | 
	
		
			
				|  |  |         //短信内容
 | 
	
		
			
				|  |  |         apiParamMap.put("content", content);
 | 
	
		
			
				|  |  |         //渠道号
 | 
	
		
			
				|  |  |         apiParamMap.put("clientId", fzClientId);
 | 
	
		
			
				|  |  |         String result = null;
 | 
	
		
			
				|  |  |         Envelop resultEnvelop = fzApiClient.fzInnerApi(api, objectMapper.writeValueAsString(apiParamMap), 1);
 | 
	
		
			
				|  |  |         if (resultEnvelop.isSuccessFlg()) {
 | 
	
		
			
				|  |  |             result = resultEnvelop.getObj().toString();
 | 
	
		
			
				|  |  |         //验证请求间隔超时,防止频繁获取验证码
 | 
	
		
			
				|  |  |         if (!wlyyRedisVerifyCodeService.isIntervalTimeout(client_id, username)) {
 | 
	
		
			
				|  |  |             throw new IllegalAccessException("SMS request frequency is too fast");
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  |         if (!StringUtils.isEmpty(result)) {
 | 
	
		
			
				|  |  |             Map<String, Object> resultMap = objectMapper.readValue(result, Map.class);
 | 
	
		
			
				|  |  |             Integer resultCode = 0;
 | 
	
		
			
				|  |  |             if (null != resultMap.get("Code") && !"".equals(resultMap.get("Code"))) {
 | 
	
		
			
				|  |  |                 resultCode = Integer.valueOf(resultMap.get("Code").toString());
 | 
	
		
			
				|  |  |             }
 | 
	
		
			
				|  |  |             if (resultCode == 10000) {
 | 
	
		
			
				|  |  |                 verifyCode.setExpiresIn(600);
 | 
	
		
			
				|  |  |                 verifyCode.setNextRequestTime(60);
 | 
	
		
			
				|  |  |                 //验证码有效期
 | 
	
		
			
				|  |  |                 ehrRedisVerifyCodeService.store(client_id, username, random, 600000);
 | 
	
		
			
				|  |  |                 envelop.setSuccessFlg(true);
 | 
	
		
			
				|  |  |                 envelop.setObj(verifyCode);
 | 
	
		
			
				|  |  |             } else if(resultCode == -201){
 | 
	
		
			
				|  |  |                 envelop.setSuccessFlg(false);
 | 
	
		
			
				|  |  |                 envelop.setErrorCode(resultCode);
 | 
	
		
			
				|  |  |                 envelop.setErrorMsg("短信已达每天限制的次数(10次)!");
 | 
	
		
			
				|  |  |             } else if(resultCode == -200){
 | 
	
		
			
				|  |  |                 envelop.setSuccessFlg(false);
 | 
	
		
			
				|  |  |                 envelop.setErrorCode(resultCode);
 | 
	
		
			
				|  |  |                 envelop.setErrorMsg("短信发送频率太快(不能低于60s)!");
 | 
	
		
			
				|  |  |             } else {
 | 
	
		
			
				|  |  |                 envelop.setSuccessFlg(false);
 | 
	
		
			
				|  |  |                 envelop.setErrorCode(resultCode);
 | 
	
		
			
				|  |  |                 envelop.setErrorMsg("短信验证码发送失败!");
 | 
	
		
			
				|  |  |             }
 | 
	
		
			
				|  |  |         } else {
 | 
	
		
			
				|  |  |             envelop.setSuccessFlg(false);
 | 
	
		
			
				|  |  |             envelop.setErrorCode(ErrorCode.REQUEST_NOT_COMPLETED.value());
 | 
	
		
			
				|  |  |             envelop.setErrorMsg("短信验证码发送失败!");
 | 
	
		
			
				|  |  |         //发送短信获取验证码
 | 
	
		
			
				|  |  |         HttpHeaders reqHeaders = new HttpHeaders();
 | 
	
		
			
				|  |  |         reqHeaders.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
 | 
	
		
			
				|  |  |         MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
 | 
	
		
			
				|  |  |         params.add("clientId", client_id);
 | 
	
		
			
				|  |  |         params.add("type", "login");
 | 
	
		
			
				|  |  |         params.add("to", username);
 | 
	
		
			
				|  |  |         HttpEntity<MultiValueMap<String, String>> httpEntity = new HttpEntity<>(params, reqHeaders);
 | 
	
		
			
				|  |  |         HashMap<String, Object> result = restTemplate.postForObject("http://svr-base:10020/sms_gateway/send", httpEntity, HashMap.class);
 | 
	
		
			
				|  |  |         if (200 == (Integer) result.get("status")){
 | 
	
		
			
				|  |  |             Map<String, Object> sms =  (Map)result.get("obj");
 | 
	
		
			
				|  |  |             String captcha = (String) sms.get("captcha");
 | 
	
		
			
				|  |  |             Date deadline = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse((String) sms.get("deadline"));
 | 
	
		
			
				|  |  |             Long expire = (deadline.getTime() - new Date().getTime()) / 1000;
 | 
	
		
			
				|  |  |             Captcha _captcha = new Captcha();
 | 
	
		
			
				|  |  |             _captcha.setCode(captcha);
 | 
	
		
			
				|  |  |             _captcha.setExpiresIn(expire.intValue());
 | 
	
		
			
				|  |  |             wlyyRedisVerifyCodeService.store(client_id, username, captcha, expire.intValue());
 | 
	
		
			
				|  |  |             Oauth2Envelop<Captcha> oauth2Envelop = new Oauth2Envelop<>("captcha", 200, _captcha);
 | 
	
		
			
				|  |  |             HttpHeaders headers = new HttpHeaders();
 | 
	
		
			
				|  |  |             headers.set("Cache-Control", "no-store");
 | 
	
		
			
				|  |  |             headers.set("Pragma", "no-cache");
 | 
	
		
			
				|  |  |             return new ResponseEntity<>(oauth2Envelop, headers, HttpStatus.OK);
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  |         return new ResponseEntity<>(envelop, headers, HttpStatus.OK);
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     @RequestMapping(value = ServiceApi.Authentication.VerifyCodeExpire, method = RequestMethod.POST)
 | 
	
		
			
				|  |  |     public ResponseEntity<VerifyCode> verifyCodeExpire(@RequestParam Map<String, String> parameters) {
 | 
	
		
			
				|  |  |         String client_id = parameters.get("client_id");
 | 
	
		
			
				|  |  |         String username = parameters.get("username");
 | 
	
		
			
				|  |  |         VerifyCode verifyCode = new VerifyCode();
 | 
	
		
			
				|  |  |         int expiresIn = ehrRedisVerifyCodeService.getExpireTime(client_id, username);
 | 
	
		
			
				|  |  |         int nextRequestTime = 60 + (expiresIn - 600 ) > 0 ? 60 + (expiresIn - 600 ) : 0;
 | 
	
		
			
				|  |  |         verifyCode.setNextRequestTime(nextRequestTime);
 | 
	
		
			
				|  |  |         verifyCode.setExpiresIn(expiresIn);
 | 
	
		
			
				|  |  |         throw new IllegalStateException((String) result.get("message"));
 | 
	
		
			
				|  |  |         /*Captcha _captcha = new Captcha();
 | 
	
		
			
				|  |  |         _captcha.setCode("12345");
 | 
	
		
			
				|  |  |         _captcha.setExpiresIn(10000);
 | 
	
		
			
				|  |  |         _captcha.setInterval(60);
 | 
	
		
			
				|  |  |         wlyyRedisVerifyCodeService.store(client_id, username, "12345", 100);
 | 
	
		
			
				|  |  |         Oauth2Envelop<Captcha> oauth2Envelop = new Oauth2Envelop("captcha", 200, _captcha);
 | 
	
		
			
				|  |  |         HttpHeaders headers = new HttpHeaders();
 | 
	
		
			
				|  |  |         headers.set("Cache-Control", "no-store");
 | 
	
		
			
				|  |  |         headers.set("Pragma", "no-cache");
 | 
	
		
			
				|  |  |         return new ResponseEntity<>(verifyCode, headers, HttpStatus.OK);
 | 
	
		
			
				|  |  |         return new ResponseEntity<>(oauth2Envelop, headers, HttpStatus.OK);*/
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     @RequestMapping(value = ServiceApi.Authentication.VerifyCodeValidate, method = RequestMethod.POST)
 | 
	
		
			
				|  |  |     public ResponseEntity<Envelop> verifyCodeValidate(@RequestParam Map<String, String> parameters) throws  Exception{
 | 
	
		
			
				|  |  |         Envelop envelop = new Envelop();
 | 
	
		
			
				|  |  |         HttpHeaders headers = new HttpHeaders();
 | 
	
		
			
				|  |  |         headers.set("Cache-Control", "no-store");
 | 
	
		
			
				|  |  |         headers.set("Pragma", "no-cache");
 | 
	
		
			
				|  |  |     /**
 | 
	
		
			
				|  |  |      * 验证验证码
 | 
	
		
			
				|  |  |      * @param parameters
 | 
	
		
			
				|  |  |      * @return
 | 
	
		
			
				|  |  |      * @throws Exception
 | 
	
		
			
				|  |  |      */
 | 
	
		
			
				|  |  |     @RequestMapping(value = "/oauth/captcha", method = RequestMethod.POST)
 | 
	
		
			
				|  |  |     public ResponseEntity<Oauth2Envelop> captchaCheck  (@RequestParam Map<String, String> parameters) throws  Exception{
 | 
	
		
			
				|  |  |         String client_id = parameters.get("client_id");
 | 
	
		
			
				|  |  |         String username = parameters.get("username");
 | 
	
		
			
				|  |  |         String verifyCode = parameters.get("verify_code");
 | 
	
		
			
				|  |  |         if (StringUtils.isEmpty(verifyCode)){
 | 
	
		
			
				|  |  |             envelop.setSuccessFlg(false);
 | 
	
		
			
				|  |  |             envelop.setErrorMsg("验证码不能为空!");
 | 
	
		
			
				|  |  |             return new ResponseEntity<>(envelop, headers, HttpStatus.OK);
 | 
	
		
			
				|  |  |         String captcha = parameters.get("captcha");
 | 
	
		
			
				|  |  |         if (StringUtils.isEmpty(client_id)) {
 | 
	
		
			
				|  |  |             throw new InvalidRequestException("client_id");
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  |         boolean _verify = ehrRedisVerifyCodeService.verification(client_id, username, verifyCode);
 | 
	
		
			
				|  |  |         if (_verify){
 | 
	
		
			
				|  |  |             envelop.setSuccessFlg(true);
 | 
	
		
			
				|  |  |         if (StringUtils.isEmpty(username)){
 | 
	
		
			
				|  |  |             throw new InvalidRequestException("username");
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  |         if (StringUtils.isEmpty(captcha)){
 | 
	
		
			
				|  |  |             throw new InvalidRequestException("captcha");
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  |         Oauth2Envelop<Boolean> oauth2Envelop;
 | 
	
		
			
				|  |  |         if (wlyyRedisVerifyCodeService.verification(client_id, username, captcha)) {
 | 
	
		
			
				|  |  |             oauth2Envelop = new Oauth2Envelop<>("验证码正确", 200, true);
 | 
	
		
			
				|  |  |         } else {
 | 
	
		
			
				|  |  |             envelop.setSuccessFlg(false);
 | 
	
		
			
				|  |  |             envelop.setErrorMsg("请输入正确的验证码!");
 | 
	
		
			
				|  |  |             oauth2Envelop = new Oauth2Envelop<>("验证码错误", 200, false);
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  |         return new ResponseEntity<>(envelop, headers, HttpStatus.OK);
 | 
	
		
			
				|  |  |     }*/
 | 
	
		
			
				|  |  |         HttpHeaders headers = new HttpHeaders();
 | 
	
		
			
				|  |  |         headers.set("Cache-Control", "no-store");
 | 
	
		
			
				|  |  |         headers.set("Pragma", "no-cache");
 | 
	
		
			
				|  |  |         return new ResponseEntity<>(oauth2Envelop, headers, HttpStatus.OK);
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     @Override
 | 
	
		
			
				|  |  |     protected TokenGranter getTokenGranter() {
 | 
	
	
		
			
				|  | @ -308,27 +355,31 @@ public class WlyyLoginEndpoint extends AbstractEndpoint {
 | 
	
		
			
				|  |  |     public ResponseEntity<Oauth2Envelop> handleException(Exception e) throws Exception {
 | 
	
		
			
				|  |  |         LOG.info(e.getMessage(), e);
 | 
	
		
			
				|  |  |         if (e instanceof UsernameNotFoundException) {
 | 
	
		
			
				|  |  |             return handleOAuth2Exception(new Oauth2Envelop("用户未注册!", HttpStatus.UNAUTHORIZED.value()));
 | 
	
		
			
				|  |  |             return handleOAuth2Exception(new Oauth2Envelop("用户未注册!", HttpStatus.UNAUTHORIZED.value()), e);
 | 
	
		
			
				|  |  |         } else if (e instanceof NoSuchClientException) {
 | 
	
		
			
				|  |  |             return handleOAuth2Exception(new Oauth2Envelop("应用未注册!", HttpStatus.UNAUTHORIZED.value()));
 | 
	
		
			
				|  |  |             return handleOAuth2Exception(new Oauth2Envelop("应用未注册!", HttpStatus.UNAUTHORIZED.value()), e);
 | 
	
		
			
				|  |  |         } else if (e instanceof InvalidGrantException) {
 | 
	
		
			
				|  |  |             if (e.getMessage().equals("verify_code")) {
 | 
	
		
			
				|  |  |                 return handleOAuth2Exception(new Oauth2Envelop("验证码有误!", HttpStatus.UNAUTHORIZED.value()));
 | 
	
		
			
				|  |  |             if (e.getMessage().contains("captcha")) {
 | 
	
		
			
				|  |  |                 return handleOAuth2Exception(new Oauth2Envelop("验证码有误!", HttpStatus.UNAUTHORIZED.value()), e);
 | 
	
		
			
				|  |  |             }
 | 
	
		
			
				|  |  |             return handleOAuth2Exception(new Oauth2Envelop("密码有误!", HttpStatus.UNAUTHORIZED.value()));
 | 
	
		
			
				|  |  |             return handleOAuth2Exception(new Oauth2Envelop("密码有误!", HttpStatus.UNAUTHORIZED.value()), e);
 | 
	
		
			
				|  |  |         } else if (e instanceof InvalidTokenException) {
 | 
	
		
			
				|  |  |             return handleOAuth2Exception(new Oauth2Envelop("Token有误!", HttpStatus.UNAUTHORIZED.value()));
 | 
	
		
			
				|  |  |             return handleOAuth2Exception(new Oauth2Envelop("Token有误!", HttpStatus.UNAUTHORIZED.value()), e);
 | 
	
		
			
				|  |  |         } else if (e instanceof InvalidRequestException) {
 | 
	
		
			
				|  |  |             return handleOAuth2Exception(new Oauth2Envelop("参数" + e.getMessage() + "缺失!", HttpStatus.UNAUTHORIZED.value()));
 | 
	
		
			
				|  |  |             return handleOAuth2Exception(new Oauth2Envelop("参数" + e.getMessage() + "缺失!", HttpStatus.UNAUTHORIZED.value()), e);
 | 
	
		
			
				|  |  |         } else if (e instanceof IllegalAccessException) {
 | 
	
		
			
				|  |  |             return handleOAuth2Exception(new Oauth2Envelop("短信请求频率过快,请稍后再试!", -1), e);
 | 
	
		
			
				|  |  |         } else if (e instanceof IllegalStateException) {
 | 
	
		
			
				|  |  |             return handleOAuth2Exception(new Oauth2Envelop("短信网关请求失败!", -1), e);
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  |         return handleOAuth2Exception(new Oauth2Envelop(e.getMessage(), -1));
 | 
	
		
			
				|  |  |         return handleOAuth2Exception(new Oauth2Envelop(e.getMessage(), -1), e);
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     private ResponseEntity<Oauth2Envelop> handleOAuth2Exception(Oauth2Envelop authenticationFailed) throws IOException {
 | 
	
		
			
				|  |  |     private ResponseEntity<Oauth2Envelop> handleOAuth2Exception(Oauth2Envelop authenticationFailed, Exception e) throws IOException {
 | 
	
		
			
				|  |  |         HttpHeaders headers = new HttpHeaders();
 | 
	
		
			
				|  |  |         headers.set("Cache-Control", "no-store");
 | 
	
		
			
				|  |  |         headers.set("Pragma", "no-cache");
 | 
	
		
			
				|  |  |         headers.set("WWW-Authenticate", String.format("%s %s", OAuth2AccessToken.BEARER_TYPE, authenticationFailed.getMessage()));
 | 
	
		
			
				|  |  |         headers.set("WWW-Authenticate", String.format("%s %s", OAuth2AccessToken.BEARER_TYPE, e.getMessage()));
 | 
	
		
			
				|  |  |         ResponseEntity<Oauth2Envelop> response = new ResponseEntity<>(authenticationFailed, headers, HttpStatus.OK);
 | 
	
		
			
				|  |  |         return response;
 | 
	
		
			
				|  |  |     }
 |