package com.xunmei.auth.service; import cn.hutool.core.util.ObjectUtil; import cn.hutool.http.HttpRequest; import cn.hutool.http.HttpUtil; import cn.hutool.json.JSONObject; import com.alibaba.fastjson2.JSON; import com.union.api.TUnionTransInfo; import com.union.api.UnionEsscAPI; import com.xunmei.auth.form.LoginBody; import com.xunmei.common.core.utils.StringUtils; import io.netty.util.internal.StringUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import java.text.MessageFormat; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @Component public class FJNXLoginService{ /** * 统一运营平台 服务ip地址 */ @Value("${fjnx.host}") private String host; /** * 统一运营平台 服务端口 */ @Value("${fjnx.port}") private String port; /** * 统一运营门户 给我们系统定义的 系统编号 */ @Value("${fjnx.systemCode}") private String systemCode; /** * 密管系统ip */ @Value("${fjnx.passIp}") private String passIp; /** * 密管系统端口 */ @Value("${fjnx.passPort}") private Integer passPort; /** * 密管系统 对应标识 */ @Value("${fjnx.appCode}") private String appCode; /** * 密管系统 秘钥 msp.uop-SM4.zek */ @Value("${fjnx.secretName}") private String secretName; /** * 统一运营门户 根据token获取用户信息 * http://{0}:{1}/yusp-group/api/session?systemCode={2} */ @Value("${fjnx.webInfoUrl}") private String webInfoUrl; /** * 统一运营门户 用户密码登录接口 * userInfoUrl: http://{0}:{1}/yusp-group/api/login?systemCode={2} */ @Value("${fjnx.userLoginUrl}") private String userLoginUrl; /** * 移动运营平台地址 */ @Value("${fjnxApp.host}") private String appHost; /** * 根据token获取移动运营平台账号信息 post方式 * https://{0}/uaa/api/v1.0/user/account?access_token={1} */ @Value("${fjnxApp.accountUrl}") private String accountUrl; /** * 根据账号获取人员信息 post方式 * https://{0}/sap/api/v1.0/user/user/find/{1}?access_token={2} */ @Value("${fjnxApp.userInfoUrl}") private String userInfoUrl; private static final Logger logger = LoggerFactory.getLogger(FJNXLoginService.class); private static final Logger tokenLoginLogger = LoggerFactory.getLogger("auth.token.login"); /** * token在统一运平台验证token,获取用户信息后返回当前登录名 * @param token * @return */ public String getUserByWebToken(String token){ String userName = null; String userInfoUrl = MessageFormat.format(webInfoUrl,host,port,systemCode); String result = HttpRequest.get(userInfoUrl) .header("Authorization","Bearer " + token) .header("Content-Type","application/json") .execute().body(); logger.info("web端token获取用户信息结果:{}",result); if(StringUtils.isEmpty(result)){ throw new RuntimeException("token验证失败"); } JSONObject jsonObject = new JSONObject(result); String code = jsonObject.getStr("code"); if(StringUtils.isNotEmpty(code) && "0".equals(code)){ String data = jsonObject.getStr("data"); JSONObject jsonData = new JSONObject(data); String userStatus = jsonData.getStr("userStatus"); String loginName = jsonData.getStr("loginName"); if(! "0".equals(userStatus)){ userName = loginName; } } return userName; } /** * H5单点登录,去移动运营平台验证token * 1、获取当前登录账号信息 * 2、根据账号信息获取用户信息 * @param token * @return */ public String getUserByAppToken(String token){ tokenLoginLogger.debug("app token登录:进入getUserByAppToken。token:{}",token); String account_url = MessageFormat.format(accountUrl,appHost,token); String accountInfo = HttpUtil.post(account_url,new HashMap<>()); tokenLoginLogger.debug("app token登录:2、请求验证token完成。token:{}",token); if(StringUtils.isEmpty(accountInfo)){ throw new RuntimeException("验证token失败,登录失败!"); } JSONObject accountJson = new JSONObject(accountInfo); if(!"true".equals(accountJson.getStr("result"))){ throw new RuntimeException("验证token失败,登录失败!"); } JSONObject accountContent = new JSONObject(accountJson.getStr("data")); String account = accountContent.getStr("username"); /* 开始获取登录账号信息 */ String user_info_url = MessageFormat.format(userInfoUrl,appHost,account,token); String userInfo = HttpUtil.post(user_info_url,new HashMap<>()); JSONObject userJson = new JSONObject(userInfo); tokenLoginLogger.debug("app token登录:3、token获取账号完成。token:{}",token); if(!"true".equals(userJson.getStr("result"))){ throw new RuntimeException("远程获取用户信息失败,登录失败!"); } JSONObject userContent = new JSONObject(userJson.getStr("data")); String sap_user = userContent.getStr("sap_user"); JSONObject info = new JSONObject(sap_user); String username = info.getStr("username"); return username; } /** * 通过密管系统加密密码,然后登录到统一运营平台 * @param login * @return */ public String webLoginByPass(LoginBody login){ /* * 加密前参数准备 */ List ipList = new ArrayList<>(); List portList = new ArrayList<>(); if(StringUtil.isNullOrEmpty(passIp)) { logger.error("密码加密失败!{}","请配置密管系统地址"); return null; } ipList.add(passIp); portList.add(passPort); logger.info("UnionEsscAPI 对象初始化参数:"+"ipList" + passIp + ", portList:" + passPort + ", timeout:" + 5 + ", sysID:" + appCode + ", appID:" + appCode + ", tlvOrXmlflag:"); //对登录用户的密码进行加密 UnionEsscAPI shortApi = new UnionEsscAPI(ipList,portList,5,appCode,appCode,""); String pass = StringUtil.toHexString(login.getPassword().getBytes()); TUnionTransInfo transInfo = shortApi.unionAPIServiceE160(1,secretName,"",0,1,pass,"",1); if(ObjectUtil.isNull(transInfo)){ return null; } int isSuccess = transInfo.getIsSuccess(); logger.info("加密结果:{}" , JSON.toJSON(transInfo).toString() ); if(ObjectUtil.notEqual(transInfo.getResponseCode(),0) || ObjectUtil.notEqual(isSuccess,1)){ logger.error("密码加密失败!{}",transInfo.getResponseRemark()); return null; } if(ObjectUtil.isNull(transInfo.getReturnBody())){ logger.error("密码加密失败,数据为空"); return null; } //开始验证用户名密码 String loginUrl = MessageFormat.format(userLoginUrl, host, port, systemCode); JSONObject object = new JSONObject(); object.accumulate("loginName",login.getUsername()); object.accumulate("pass",transInfo.getReturnBody().getData()); object.accumulate("type",1); object.accumulate("systemCode",systemCode); object.accumulate("passwordType",1); String loginContent = HttpRequest.post(loginUrl) .header("Content-Type","application/json") .contentType("application/json") .charset("utf-8") .body(object.toString()) .execute().body(); logger.info("登录后信息:{}",loginContent); JSONObject jsonObject = new JSONObject(loginContent); String code = jsonObject.getStr("code"); if(StringUtils.isNotEmpty(code) && "0".equals(code)){ JSONObject jsonData = new JSONObject(jsonObject.getStr("data")); String tokenThird = jsonData.getStr("token"); logger.info("登录后的token:{}",tokenThird); return tokenThird; } logger.error("登录失败,{}",jsonObject.getStr("message")); return null; } }