FJNXLoginService.java 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266
  1. package com.xunmei.auth.service;
  2. import cn.hutool.core.util.ObjectUtil;
  3. import cn.hutool.http.HttpRequest;
  4. import cn.hutool.http.HttpUtil;
  5. import cn.hutool.json.JSONObject;
  6. import com.alibaba.fastjson2.JSON;
  7. import com.union.api.TUnionTransInfo;
  8. import com.union.api.UnionEsscAPI;
  9. import com.xunmei.auth.form.LoginBody;
  10. import com.xunmei.common.core.utils.StringUtils;
  11. import io.netty.util.internal.StringUtil;
  12. import org.slf4j.Logger;
  13. import org.slf4j.LoggerFactory;
  14. import org.springframework.beans.factory.annotation.Value;
  15. import org.springframework.stereotype.Component;
  16. import java.text.MessageFormat;
  17. import java.util.ArrayList;
  18. import java.util.HashMap;
  19. import java.util.List;
  20. @Component
  21. public class FJNXLoginService{
  22. /**
  23. * 统一运营平台 服务ip地址
  24. */
  25. @Value("${fjnx.host}")
  26. private String host;
  27. /**
  28. * 统一运营平台 服务端口
  29. */
  30. @Value("${fjnx.port}")
  31. private String port;
  32. /**
  33. * 统一运营门户 给我们系统定义的 系统编号
  34. */
  35. @Value("${fjnx.systemCode}")
  36. private String systemCode;
  37. /**
  38. * 密管系统ip
  39. */
  40. @Value("${fjnx.passIp}")
  41. private String passIp;
  42. /**
  43. * 密管系统端口
  44. */
  45. @Value("${fjnx.passPort}")
  46. private Integer passPort;
  47. /**
  48. * 密管系统 对应标识
  49. */
  50. @Value("${fjnx.appCode}")
  51. private String appCode;
  52. /**
  53. * 密管系统 秘钥 msp.uop-SM4.zek
  54. */
  55. @Value("${fjnx.secretName}")
  56. private String secretName;
  57. /**
  58. * 统一运营门户 根据token获取用户信息
  59. * http://{0}:{1}/yusp-group/api/session?systemCode={2}
  60. */
  61. @Value("${fjnx.webInfoUrl}")
  62. private String webInfoUrl;
  63. /**
  64. * 统一运营门户 用户密码登录接口
  65. * userInfoUrl: http://{0}:{1}/yusp-group/api/login?systemCode={2}
  66. */
  67. @Value("${fjnx.userLoginUrl}")
  68. private String userLoginUrl;
  69. /**
  70. * 移动运营平台地址
  71. */
  72. @Value("${fjnxApp.host}")
  73. private String appHost;
  74. /**
  75. * 根据token获取移动运营平台账号信息 post方式
  76. * https://{0}/uaa/api/v1.0/user/account?access_token={1}
  77. */
  78. @Value("${fjnxApp.accountUrl}")
  79. private String accountUrl;
  80. /**
  81. * 根据账号获取人员信息 post方式
  82. * https://{0}/sap/api/v1.0/user/user/find/{1}?access_token={2}
  83. */
  84. @Value("${fjnxApp.userInfoUrl}")
  85. private String userInfoUrl;
  86. private static final Logger logger = LoggerFactory.getLogger(FJNXLoginService.class);
  87. private static final Logger tokenLoginLogger = LoggerFactory.getLogger("auth.token.login");
  88. /**
  89. * token在统一运平台验证token,获取用户信息后返回当前登录名
  90. * @param token
  91. * @return
  92. */
  93. public String getUserByWebToken(String token){
  94. String userName = null;
  95. String userInfoUrl = MessageFormat.format(webInfoUrl,host,port,systemCode);
  96. String result = HttpRequest.get(userInfoUrl)
  97. .header("Authorization","Bearer " + token)
  98. .header("Content-Type","application/json")
  99. .execute().body();
  100. logger.info("web端token获取用户信息结果:{}",result);
  101. if(StringUtils.isEmpty(result)){
  102. throw new RuntimeException("token验证失败");
  103. }
  104. JSONObject jsonObject = new JSONObject(result);
  105. String code = jsonObject.getStr("code");
  106. if(StringUtils.isNotEmpty(code) && "0".equals(code)){
  107. String data = jsonObject.getStr("data");
  108. JSONObject jsonData = new JSONObject(data);
  109. String userStatus = jsonData.getStr("userStatus");
  110. String loginName = jsonData.getStr("loginName");
  111. if(! "0".equals(userStatus)){
  112. userName = loginName;
  113. }
  114. }
  115. return userName;
  116. }
  117. /**
  118. * H5单点登录,去移动运营平台验证token
  119. * 1、获取当前登录账号信息
  120. * 2、根据账号信息获取用户信息
  121. * @param token
  122. * @return
  123. */
  124. public String getUserByAppToken(String token){
  125. tokenLoginLogger.debug("app token登录:进入getUserByAppToken。token:{}",token);
  126. String account_url = MessageFormat.format(accountUrl,appHost,token);
  127. String accountInfo = HttpUtil.post(account_url,new HashMap<>());
  128. tokenLoginLogger.debug("app token登录:2、请求验证token完成。token:{}",token);
  129. if(StringUtils.isEmpty(accountInfo)){
  130. throw new RuntimeException("验证token失败,登录失败!");
  131. }
  132. JSONObject accountJson = new JSONObject(accountInfo);
  133. if(!"true".equals(accountJson.getStr("result"))){
  134. throw new RuntimeException("验证token失败,登录失败!");
  135. }
  136. JSONObject accountContent = new JSONObject(accountJson.getStr("data"));
  137. String account = accountContent.getStr("username");
  138. /*
  139. 开始获取登录账号信息
  140. */
  141. String user_info_url = MessageFormat.format(userInfoUrl,appHost,account,token);
  142. String userInfo = HttpUtil.post(user_info_url,new HashMap<>());
  143. JSONObject userJson = new JSONObject(userInfo);
  144. tokenLoginLogger.debug("app token登录:3、token获取账号完成。token:{}",token);
  145. if(!"true".equals(userJson.getStr("result"))){
  146. throw new RuntimeException("远程获取用户信息失败,登录失败!");
  147. }
  148. JSONObject userContent = new JSONObject(userJson.getStr("data"));
  149. String sap_user = userContent.getStr("sap_user");
  150. JSONObject info = new JSONObject(sap_user);
  151. String username = info.getStr("username");
  152. return username;
  153. }
  154. /**
  155. * 通过密管系统加密密码,然后登录到统一运营平台
  156. * @param login
  157. * @return
  158. */
  159. public String webLoginByPass(LoginBody login){
  160. /*
  161. * 加密前参数准备
  162. */
  163. List<String> ipList = new ArrayList<>();
  164. List<Integer> portList = new ArrayList<>();
  165. if(StringUtil.isNullOrEmpty(passIp))
  166. {
  167. logger.error("密码加密失败!{}","请配置密管系统地址");
  168. return null;
  169. }
  170. ipList.add(passIp);
  171. portList.add(passPort);
  172. logger.info("UnionEsscAPI 对象初始化参数:"+"ipList" + passIp + ", portList:" + passPort + ", timeout:" + 5 + ", sysID:" + appCode + ", appID:" + appCode + ", tlvOrXmlflag:");
  173. //对登录用户的密码进行加密
  174. UnionEsscAPI shortApi = new UnionEsscAPI(ipList,portList,5,appCode,appCode,"");
  175. String pass = StringUtil.toHexString(login.getPassword().getBytes());
  176. TUnionTransInfo transInfo = shortApi.unionAPIServiceE160(1,secretName,"",0,1,pass,"",1);
  177. if(ObjectUtil.isNull(transInfo)){
  178. return null;
  179. }
  180. int isSuccess = transInfo.getIsSuccess();
  181. logger.info("加密结果:{}" , JSON.toJSON(transInfo).toString() );
  182. if(ObjectUtil.notEqual(transInfo.getResponseCode(),0) || ObjectUtil.notEqual(isSuccess,1)){
  183. logger.error("密码加密失败!{}",transInfo.getResponseRemark());
  184. return null;
  185. }
  186. if(ObjectUtil.isNull(transInfo.getReturnBody())){
  187. logger.error("密码加密失败,数据为空");
  188. return null;
  189. }
  190. //开始验证用户名密码
  191. String loginUrl = MessageFormat.format(userLoginUrl, host, port, systemCode);
  192. JSONObject object = new JSONObject();
  193. object.accumulate("loginName",login.getUsername());
  194. object.accumulate("pass",transInfo.getReturnBody().getData());
  195. object.accumulate("type",1);
  196. object.accumulate("systemCode",systemCode);
  197. object.accumulate("passwordType",1);
  198. String loginContent = HttpRequest.post(loginUrl)
  199. .header("Content-Type","application/json")
  200. .contentType("application/json")
  201. .charset("utf-8")
  202. .body(object.toString())
  203. .execute().body();
  204. logger.info("登录后信息:{}",loginContent);
  205. JSONObject jsonObject = new JSONObject(loginContent);
  206. String code = jsonObject.getStr("code");
  207. if(StringUtils.isNotEmpty(code) && "0".equals(code)){
  208. JSONObject jsonData = new JSONObject(jsonObject.getStr("data"));
  209. String tokenThird = jsonData.getStr("token");
  210. logger.info("登录后的token:{}",tokenThird);
  211. return tokenThird;
  212. }
  213. logger.error("登录失败,{}",jsonObject.getStr("message"));
  214. return null;
  215. }
  216. }