TokenServiceImpl.java 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. package com.jkcredit.identity.service.Impl;
  2. import cn.hutool.json.JSONUtil;
  3. import com.fasterxml.jackson.databind.ObjectMapper;
  4. import com.jkcredit.identity.constant.CommonConstants;
  5. import com.jkcredit.identity.model.to.HandTO;
  6. import com.jkcredit.identity.model.to.LoginTO;
  7. import com.jkcredit.identity.model.vo.ApiResponse;
  8. import com.jkcredit.identity.model.vo.HandVo;
  9. import com.jkcredit.identity.model.vo.TokenVo;
  10. import com.jkcredit.identity.service.TokenService;
  11. import com.jkcredit.identity.util.TokenConCurrentHashMapUtil;
  12. import com.zdab.ukey.service.UKeyService;
  13. import lombok.extern.slf4j.Slf4j;
  14. import org.springframework.beans.factory.annotation.Autowired;
  15. import org.springframework.beans.factory.annotation.Value;
  16. import org.springframework.core.ParameterizedTypeReference;
  17. import org.springframework.data.redis.core.StringRedisTemplate;
  18. import org.springframework.http.*;
  19. import org.springframework.stereotype.Service;
  20. import org.springframework.web.client.RestTemplate;
  21. import javax.annotation.PostConstruct;
  22. import java.time.LocalDateTime;
  23. import java.time.format.DateTimeFormatter;
  24. import java.util.Map;
  25. /**
  26. * @author xusonglin
  27. * @version V1.0
  28. **/
  29. @Service
  30. @Slf4j
  31. public class TokenServiceImpl implements TokenService {
  32. @Value("${rz.info.username}")
  33. String username;
  34. @Value("${rz.info.password}")
  35. String password;
  36. @Value("${rz.info.url}")
  37. String url;
  38. private static String handUrl;
  39. private static String tokenUrl;
  40. @Autowired
  41. private UKeyService uKeyService;
  42. @Autowired
  43. private RestTemplate restTemplate;
  44. @Autowired
  45. StringRedisTemplate stringRedisTemplate;
  46. @Autowired
  47. ObjectMapper objectMapper;
  48. @PostConstruct
  49. public void init() {
  50. handUrl = url + "/ab/auth/hand";
  51. tokenUrl = url + "/ab/auth/token";
  52. }
  53. @Override
  54. public TokenVo getToken() {
  55. Map<String, TokenVo> tokenVoMap = TokenConCurrentHashMapUtil.getInstance();
  56. if (tokenVoMap.size() == 0) {
  57. return queryToken();
  58. } else {
  59. return tokenVoMap.get(CommonConstants.TOKEN_KEY);
  60. }
  61. }
  62. @Override
  63. public TokenVo queryToken() {
  64. log.info("**认证握手**");
  65. HandTO handTo = new HandTO();
  66. String timeStamp = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"));
  67. handTo.setTimeStamp(timeStamp);
  68. HttpHeaders headers = new HttpHeaders();
  69. headers.setContentType(MediaType.APPLICATION_JSON);
  70. // 握手阶段请求头需携带用户名
  71. headers.set("X-Main-Id", username);
  72. log.info("username:{}", username);
  73. log.info("password:{}", password);
  74. log.info("handUrl:{}", handUrl);
  75. log.info("handTo: {}", JSONUtil.toJsonPrettyStr(handTo));
  76. HttpEntity<HandTO> entity = new HttpEntity<>(handTo, headers);
  77. ResponseEntity<ApiResponse<HandVo>> exchange = restTemplate.exchange(handUrl, HttpMethod.POST, entity, new ParameterizedTypeReference<ApiResponse<HandVo>>() {
  78. });
  79. ApiResponse<HandVo> response = exchange.getBody();
  80. String svrRandom = "";
  81. if (response != null) {
  82. if (response.getCode() != 0) {
  83. log.info("err code: {}, err msg: {}", response.getCode(), response.getMsg());
  84. return null;
  85. }
  86. log.info("handVo: {}", JSONUtil.toJsonPrettyStr(response.getData()));
  87. svrRandom = response.getData().getSvrRandom();
  88. }
  89. log.info("**获取令牌**");
  90. LoginTO.BizData bizData = new LoginTO.BizData();
  91. bizData.setUsername(username);
  92. bizData.setCredentials(password);
  93. timeStamp = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"));
  94. bizData.setTimeStamp(timeStamp);
  95. // 业务数据签名需设置上服务端随机数
  96. bizData.setR1(svrRandom);
  97. bizData.setR2(uKeyService.genRandomBytes(16));
  98. LoginTO loginTo = new LoginTO();
  99. loginTo.setBizData(bizData);
  100. String sign = "";
  101. try {
  102. sign = uKeyService.digestECCSign(objectMapper.writeValueAsString(bizData));
  103. log.info(sign);
  104. } catch (Exception e) {
  105. log.error("digestECCSign.Exception:", e);
  106. return null;
  107. }
  108. loginTo.setSign(sign);
  109. // 请求时不要携带随机数
  110. bizData.setR1(null);
  111. log.info("LoginTo: {}", JSONUtil.toJsonPrettyStr(loginTo));
  112. headers.clear();
  113. headers.setContentType(MediaType.APPLICATION_JSON);
  114. HttpEntity<LoginTO> entity2 = new HttpEntity<>(loginTo, headers);
  115. ResponseEntity<ApiResponse<TokenVo>> exchange2 = restTemplate.exchange(tokenUrl, HttpMethod.POST, entity2,
  116. new ParameterizedTypeReference<ApiResponse<TokenVo>>() {
  117. });
  118. ApiResponse<TokenVo> response2 = exchange2.getBody();
  119. if (response2 != null) {
  120. if (response2.getCode() != 0) {
  121. log.info("err code: {}, err msg: {}", response2.getCode(), response2.getMsg());
  122. return null;
  123. }
  124. TokenVo tokenVo = response2.getData();
  125. log.info("tokenVo: {}", JSONUtil.toJsonPrettyStr(tokenVo));
  126. tokenVo.setEncKey(uKeyService.envelopedDecrypt(tokenVo.getEncKey()));
  127. tokenVo.setUsername(username);
  128. TokenConCurrentHashMapUtil.updateToken(tokenVo);
  129. return tokenVo;
  130. } else {
  131. return null;
  132. }
  133. }
  134. }