package com.engine.ditoSsologin.service.impl; import com.alibaba.fastjson.JSONObject; import com.cloudstore.dev.api.util.Util_DataCache; import com.engine.core.impl.Service; import com.engine.ditoSsologin.service.MobileSsoLoginService; import org.apache.commons.lang3.StringUtils; import weaver.general.BaseBean; import weaver.hrm.User; import weaver.interfaces.util.HttpUtils; import java.io.IOException; import java.util.HashMap; import java.util.Map; import static com.engine.ditoSsologin.constant.DitoConstant.*; /** * @version 1.0 * @Title ecology-9 * @Company 泛微软件 * @CreateDate 2022/10/26 * @Description 单点登录 * @Author Lee */ public class MobileSsoLoginServiceImpl extends Service implements MobileSsoLoginService { @Override public Map getUserAccessToken(Map paramMap, User user) { Map dataMap = new HashMap<>(); BaseBean baseBean = new BaseBean(); //从缓存中获取用户accessToken String userAccessTokenCache = (String) Util_DataCache.getObjVal(SSO_LOGIN_USER_ACCESS_TOKEN + user.getLoginid()); if (returnTokenWithCache(dataMap, userAccessTokenCache)) { return dataMap; } //请求链接地址 String userAccessTokenUrl = baseBean.getPropValue("weaverssologin", "userAccessTokenUrl"); dataMap.put("api_status", false); try { String authCode = (String) paramMap.get("auth_code"); //获取应用access_token String accessToken = getAccessToken(); HashMap requestMap = new HashMap<>(); requestMap.put("auth_code", authCode); requestMap.put("access_token", accessToken); //请求获取用户accessToken String data = HttpUtils.doPost(userAccessTokenUrl, requestMap, null); JSONObject dataJson = JSONObject.parseObject(data); String resultCode = dataJson.getString("resultCode"); JSONObject resultJson = dataJson.getJSONObject("result"); if (resultJson != null && SUCCESS_RESULT_CODE.equals(resultCode)) { baseBean.writeLog("获取userAccessToken", resultJson.toString()); String userAccessToken = resultJson.getString("access_token"); String expiresIn = resultJson.getString("expires_in"); String refreshToken = resultJson.getString("refresh_token"); //access_token加缓存 Util_DataCache.setObjValWithRedis(SSO_LOGIN_ACCESS_TOKEN, refreshToken, Integer.parseInt(expiresIn)); Util_DataCache.setObjValWithRedis(SSO_LOGIN_USER_ACCESS_TOKEN + user.getLoginid(), userAccessToken, Integer.parseInt(expiresIn)); dataMap.put("api_status", true); dataMap.put("data", resultJson.getInnerMap()); return dataMap; } baseBean.writeLog("获取userAccessToken失败", dataJson.toString()); return dataMap; } catch (Exception e) { baseBean.writeLog("获取userAccessToken异常", e.getMessage()); dataMap.put("api_status", false); dataMap.put("errorMsg", e.getMessage()); return dataMap; } } @Override public Map getUserInfo(Map paramMap, User user) { Map dataMap = new HashMap<>(); BaseBean baseBean = new BaseBean(); try { String authCode = (String) paramMap.get("auth_code"); String accessToken = (String) Util_DataCache.getObjVal(SSO_LOGIN_ACCESS_TOKEN); if (StringUtils.isEmpty(accessToken)) { accessToken = getAccessToken(); } // String userAccessToken = (String) Util_DataCache.getObjVal(SSO_LOGIN_USER_ACCESS_TOKEN + user.getLoginid()); //请求链接地址 String userInfoUrl = baseBean.getPropValue("weaverssologin", "userInfoUrl"); dataMap.put("api_status", false); HashMap requestMap = new HashMap<>(); requestMap.put("auth_code", authCode); requestMap.put("access_token", accessToken); String data = HttpUtils.doPost(userInfoUrl, requestMap, null); JSONObject dataJson = JSONObject.parseObject(data); String resultCode = dataJson.getString("resultCode"); JSONObject resultJson = dataJson.getJSONObject("result"); if (resultJson != null && SUCCESS_RESULT_CODE.equals(resultCode)) { baseBean.writeLog("获取用户信息状态码:", resultCode); dataMap.put("api_status", true); dataMap.put("data", resultJson.getInnerMap()); return dataMap; } baseBean.writeLog("获取用户信息失败", dataJson.toString()); return dataMap; } catch (Exception e) { baseBean.writeLog("获取用户信息异常", e.getMessage()); dataMap.put("api_status", false); dataMap.put("errorMsg", e.getMessage()); return dataMap; } } @Override public Map getAccessToken(Map paramMap, User paramUser) { Map dataMap = new HashMap<>(); BaseBean baseBean = new BaseBean(); String accessTokenCache = (String) Util_DataCache.getObjVal(SSO_LOGIN_ACCESS_TOKEN); if (returnTokenWithCache(dataMap, accessTokenCache)) { return dataMap; } //请求链接地址 String accessTokenUrl = baseBean.getPropValue("weaverssologin", "accessTokenUrl"); String appKey = baseBean.getPropValue("weaverssologin", "appKey"); String appSecret = baseBean.getPropValue("weaverssologin", "appSecret"); dataMap.put("api_status", false); try { HashMap requestMap = new HashMap<>(); requestMap.put("appKey", appKey); requestMap.put("appSecret", appSecret); String data = HttpUtils.doPost(accessTokenUrl, requestMap, null); JSONObject dataJson = JSONObject.parseObject(data); String resultCode = dataJson.getString("resultCode"); JSONObject resultJson = dataJson.getJSONObject("result"); if (resultJson != null && SUCCESS_RESULT_CODE.equals(resultCode)) { baseBean.writeLog("获取accessToken", resultJson.toString()); String accessToken = resultJson.getString("access_token"); String expiresIn = resultJson.getString("expires_in"); Util_DataCache.setObjValWithRedis(SSO_LOGIN_ACCESS_TOKEN, accessToken, Integer.parseInt(expiresIn)); dataMap.put("api_status", true); dataMap.put("data", resultJson.getInnerMap()); return dataMap; } baseBean.writeLog("获取accessToken失败", dataJson.toString()); return dataMap; } catch (Exception e) { baseBean.writeLog("获取accessToken异常", e.getMessage()); dataMap.put("api_status", false); dataMap.put("errorMsg", e.getMessage()); return dataMap; } } private boolean returnTokenWithCache(Map dataMap, String userAccessTokenCache) { if (StringUtils.isNotEmpty(userAccessTokenCache)) { dataMap.put("api_status", true); Map resultMap = new HashMap<>(); resultMap.put("access_token", userAccessTokenCache); dataMap.put("data", resultMap); return true; } return false; } private String getAccessToken() throws IOException { String accessToken = (String) Util_DataCache.getObjVal(SSO_LOGIN_ACCESS_TOKEN); if (StringUtils.isEmpty(accessToken)) { Map accessTokenMap = getAccessToken(null, null); Map data = (Map) accessTokenMap.get("data"); accessToken = (String) data.get("access_token"); } return accessToken; } }