You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
176 lines
6.8 KiB
176 lines
6.8 KiB
2 years ago
|
package com.fr.plugin.web.hander;
|
||
|
|
||
|
import com.fanruan.api.log.LogKit;
|
||
|
import com.fr.decision.authority.AuthorityContext;
|
||
|
import com.fr.decision.authority.data.User;
|
||
|
import com.fr.decision.fun.impl.BaseHttpHandler;
|
||
|
import com.fr.decision.webservice.v10.login.LoginService;
|
||
|
import com.fr.general.FRLogger;
|
||
|
import com.fr.json.JSONObject;
|
||
|
import com.fr.log.FineLoggerFactory;
|
||
|
import com.fr.plugin.dao.MyEntityDao;
|
||
|
import com.fr.plugin.entitys.YTUserEntity;
|
||
|
import com.fr.plugin.entitys.YtOutputMyEntity;
|
||
|
import com.fr.plugin.utils.UserSync;
|
||
|
import com.fr.plugin.utils.YiTuanMaManager;
|
||
|
import com.fr.plugin.utils.YiTuanMaUtils;
|
||
|
import com.fr.plugin.yt.MyDecisionDBAccess;
|
||
|
import com.fr.stable.StringUtils;
|
||
|
import com.fr.stable.db.action.DBAction;
|
||
|
import com.fr.stable.db.dao.DAOContext;
|
||
|
import com.fr.stable.query.QueryFactory;
|
||
|
import com.fr.stable.query.restriction.RestrictionFactory;
|
||
|
import com.fr.third.springframework.web.bind.annotation.RequestMethod;
|
||
|
import com.fr.web.utils.WebUtils;
|
||
|
|
||
|
import javax.servlet.http.HttpServletRequest;
|
||
|
import javax.servlet.http.HttpServletResponse;
|
||
|
import java.util.HashMap;
|
||
|
|
||
|
public class H5LoginHandler extends BaseHttpHandler {
|
||
|
@Override
|
||
|
public RequestMethod getMethod() {
|
||
|
return null;
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
public String getPath() {
|
||
|
return "/yt/h5login";
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
public boolean isPublic() {
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
private boolean autoLogin(HttpServletRequest req, HttpServletResponse res) throws Exception {
|
||
|
|
||
|
String authCode = WebUtils.getHTTPRequestParameter(req, "authCode");
|
||
|
String clientId = WebUtils.getHTTPRequestParameter(req, "clientId");
|
||
|
if (StringUtils.isBlank(clientId)) {
|
||
|
String id = req.getParameter("callBack");
|
||
|
clientId = getClientIdById(id);
|
||
|
}
|
||
|
if (StringUtils.isEmpty(authCode)) {
|
||
|
FRLogger.getLogger().error("==================== 获取xx码authCode失败!");
|
||
|
FineLoggerFactory.getLogger().info("登陆用户失败,响应:" + res);
|
||
|
return false;
|
||
|
}
|
||
|
String access_token = YiTuanMaUtils.getAccessToken(clientId);
|
||
|
String yiTuanMaUserId = YiTuanMaUtils.getCurrentUserId(clientId, authCode, access_token);
|
||
|
YTUserEntity userEntity = UserSync.findById(yiTuanMaUserId);
|
||
|
String fsUserName = "";
|
||
|
if (userEntity != null) {
|
||
|
String phone = userEntity.getPhone();
|
||
|
User user = getUserByPhone(phone);
|
||
|
if (user != null) {
|
||
|
fsUserName = user.getUserName();
|
||
|
}
|
||
|
}
|
||
|
if (StringUtils.isNotBlank(fsUserName)) {
|
||
|
String callBack = req.getParameter("callBack");
|
||
|
LoginService.getInstance().login(req, res, fsUserName);
|
||
|
if ("false".equalsIgnoreCase(callBack)) {
|
||
|
callBack = "";
|
||
|
}
|
||
|
if (StringUtils.isNotBlank(callBack)) {
|
||
|
if (!callBack.startsWith("http")) {
|
||
|
callBack = getCallbackUrlById(callBack);
|
||
|
}
|
||
|
sendRedirect(req, res, callBack);
|
||
|
} else {
|
||
|
String header = req.getHeader("user-agent");
|
||
|
String cloudHost = YiTuanMaManager.getInstance().getUrl();
|
||
|
if (isH5(header)) {
|
||
|
cloudHost += "/url/mobile";
|
||
|
}
|
||
|
sendRedirect(req, res, cloudHost);
|
||
|
}
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
private String getCallbackUrlById(String id) {
|
||
|
|
||
|
try {
|
||
|
return MyDecisionDBAccess.getAccessor().runDMLAction(new DBAction<String>() {
|
||
|
@Override
|
||
|
public String run(DAOContext daoContext) throws Exception {
|
||
|
MyEntityDao dao = daoContext.getDAO(MyEntityDao.class);
|
||
|
YtOutputMyEntity myEntity = dao.findOne(QueryFactory.create().addRestriction(RestrictionFactory.eq("id", id)));
|
||
|
LogKit.error("查询到:{} 回调地址为:{}", id, myEntity.getGoUrl());
|
||
|
return myEntity.getGoUrl();
|
||
|
}
|
||
|
});
|
||
|
} catch (Exception e) {
|
||
|
LogKit.error("查询配置失败", e);
|
||
|
}
|
||
|
return "";
|
||
|
}
|
||
|
|
||
|
private boolean isH5(String header) {
|
||
|
//Mozilla/5.0 (iPhone; CPU iPhone OS 13_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 TencentMTA/1 ESENYUN_TOKEN:cd97af45-7c7b-4da7-81ca-655347629c79
|
||
|
if (StringUtils.isNotBlank(header)) {
|
||
|
return header.contains("ESENYUN_TOKEN");
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
private void sendRedirect(HttpServletRequest req, HttpServletResponse res, String url) {
|
||
|
|
||
|
res.setStatus(HttpServletResponse.SC_MOVED_TEMPORARILY);
|
||
|
res.setHeader("Location", url);
|
||
|
}
|
||
|
|
||
|
private User getUserByPhone(String phone) {
|
||
|
try {
|
||
|
return AuthorityContext.getInstance().getUserController().findOne(QueryFactory.create().addRestriction(RestrictionFactory.eq("mobile", phone)));
|
||
|
} catch (Exception e) {
|
||
|
e.printStackTrace();
|
||
|
}
|
||
|
return null;
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
public void handle(HttpServletRequest req, HttpServletResponse httpServletResponse) throws Exception {
|
||
|
String authCode = req.getParameter("authCode");
|
||
|
String clientId = req.getParameter("clientId");
|
||
|
if (StringUtils.isNotBlank(authCode)) {
|
||
|
boolean login = autoLogin(req, httpServletResponse);
|
||
|
JSONObject jsonObject = new JSONObject();
|
||
|
if (login) {
|
||
|
jsonObject.put("status", -1);
|
||
|
jsonObject.put("message", "登录失败");
|
||
|
com.fr.web.utils.WebUtils.flushSuccessMessageAutoClose(req, httpServletResponse, jsonObject);
|
||
|
return;
|
||
|
}
|
||
|
} else {
|
||
|
HashMap<String, String> hashMap = new HashMap<>();
|
||
|
if (StringUtils.isBlank(clientId)) {
|
||
|
String id = req.getParameter("callBack");
|
||
|
clientId = getClientIdById(id);
|
||
|
}
|
||
|
hashMap.put("ticket", YiTuanMaUtils.getTicket(clientId));
|
||
|
hashMap.put("clientId", clientId);
|
||
|
hashMap.put("servletURL", req.getContextPath() + req.getServletPath());
|
||
|
WebUtils.writeOutTemplate("/com/fr/plugin/web/login.tpl", httpServletResponse, hashMap);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private String getClientIdById(String id) {
|
||
|
try {
|
||
|
return MyDecisionDBAccess.getAccessor().runQueryAction(new DBAction<String>() {
|
||
|
@Override
|
||
|
public String run(DAOContext daoContext) throws Exception {
|
||
|
MyEntityDao dao = daoContext.getDAO(MyEntityDao.class);
|
||
|
YtOutputMyEntity myEntity = dao.findOne(QueryFactory.create().addRestriction(RestrictionFactory.eq("id", id)));
|
||
|
return myEntity.getClientId();
|
||
|
}
|
||
|
});
|
||
|
} catch (Exception e) {
|
||
|
e.printStackTrace();
|
||
|
}
|
||
|
return "";
|
||
|
}
|
||
|
}
|