苍穹开发说明---竹云单点登录
竹云单点登录接口文档
1、功能介绍
用户通过竹云界面,输入账号密码,通过该账号绑定的苍穹用户,跳转到苍穹页面。
2、流程概述
1、访问苍穹系统登录地址;
2、苍穹系统拦截请求,判断如果没有登录会话信息,则重定向至竹云登录界面(拼接地址,不包含用户信息),在竹云登录界面输入账号密码;
3、竹云系统验证登录账号和密码,登录成功后回调访问苍穹系统(带有code值);
4、苍穹进行拦截请求,判断如果code不为空,则解析URL,调用竹云接口获取token值,并校验token是否有效,如果有效则回调访问苍穹系统成功登录(带有用户信息),如果code为空或者token无效则继续重定向至竹云系统登录界面;
2.1流程图
3、接口运行流程
1、访问苍穹系统登录地址;
2、苍穹系统拦截请求,是否有登录会话信息
此步代码示例:
String code = request.getParameter("code");
if (code != null)
3、判断如果没有登录会话信息,则重定向至竹云登录界面(拼接地址,不包含用户信息),在竹云登录界面输入账号密码;
此步代码示例:
《1》解析当前地址
REQUEST_URL = "http:" + ((HttpChannelOverHttp) ((Response) response).getHttpChannel()).getRequest().getHttpURI().toString();
《2》拼接地址,并重定向
response.sendRedirect(redirectUrl);
4、登陆成功访问,返回带有 code 的信息回来,若为空,执行步骤三
5、拼接相关信息,调用接口获取 access_token,若获取失败,执行步骤三
此步代码示例:
ResponseEntity<Map> mapResponseEntity =restTemplate.postForEntity(tokenPathUrl, null, Map.class);
Map tokenBody = mapResponseEntity.getBody();
Object access_token = tokenBody.get("access_token");
6、根据token,拼接地址,调用接口获取用户信息,若获取失败,执行步骤三
mapResponseEntity = restTemplate.getForEntity(userPathUrl, Map.class);
Map userBody = mapResponseEntity.getBody();
Object mobile = userBody.get("mobile");
7、登陆实现,编写自己登陆逻辑,并返回
UserAuthResult result = new UserAuthResult();
result.setUserType(UserProperType.Mobile);
result.setUser(mobile);
result.setSucess(true)
4、代码示例
package focus.mc.sso;
import kd.bos.logging.Log;
import kd.bos.logging.LogFactory;
import kd.bos.login.thirdauth.ThirdSSOAuthHandler;
import kd.bos.login.thirdauth.UserAuthResult;
import kd.bos.login.thirdauth.UserProperType;
import org.eclipse.jetty.server.HttpChannelOverHttp;
import org.eclipse.jetty.server.Response;
import org.springframework.http.ResponseEntity;
import org.springframework.web.client.RestTemplate;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.net.URLEncoder;
import java.util.Map;
/**
* 单点登录
* @program:node-debug-mservice
* @author: Zj
* @create:2021-03-30-14-02
*/
public class SSOLoginPugin implements ThirdSSOAuthHandler {
private static final Log log = LogFactory.getLog(SSOLoginPugin.class);
private static String REQUEST_URL = "";
@Override
public void callTrdSSOLogin(HttpServletRequest httpServletRequest, HttpServletResponse response, String s) {
}
/**
* 该方法实现第三发插件认证及认证结果的返回
* @param request
* @param response
* @return
*/
@Override
public UserAuthResult getTrdSSOAuth(HttpServletRequest request, HttpServletResponse response) {
//获取当前路径
REQUEST_URL = "http:" + ((HttpChannelOverHttp) ((Response) response).getHttpChannel()).getRequest().getHttpURI().toString();
String ZY_URL = "https://iam.fmtest.cn:8443";
//登录跳转地址
String OAUTHCODE_URL = ZY_URL + "/idp/oauth2/authorize";
//获取Token
//获取 Access_Token的url
String TOKEN_URL = ZY_URL + "/idp/oauth2/getToken";
//获取用户信息
String USER_URL = ZY_URL + "/idp/oauth2/getUserInfo";
try {
String code = request.getParameter("code");
log.info("竹云访问苍穹上下文参数:" + code);
if (code != null) {
String client_id = "client_id=" + "fmwelkin";
String client_secret = "client_secret=" + "f1b61d3a4b434541a635dda66a552f50";
String grant_type = "grant_type=" + "authorization_code";
String tokenPathUrl = TOKEN_URL + "?" + client_id + "&" + client_secret + "&code=" + code + "&" + grant_type;
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<Map> mapResponseEntity = restTemplate.postForEntity(tokenPathUrl, null, Map.class);
Map tokenBody = mapResponseEntity.getBody();
if (tokenBody == null) {
log.info("获取access_token失败:" + tokenBody.toString());
loginFail(response, OAUTHCODE_URL, REQUEST_URL);
}
log.info("获取access_token成功:" + tokenBody.toString());
Object access_token = tokenBody.get("access_token");
//拼接获取用户地址
String userPathUrl = USER_URL + "?access_token=" + access_token + "&" + client_id;
//获取用户信息
mapResponseEntity = restTemplate.getForEntity(userPathUrl, Map.class);
Map userBody = mapResponseEntity.getBody();
if (userBody == null) {
log.info("获取用户信息失败:" + userBody.toString());
loginFail(response, OAUTHCODE_URL, REQUEST_URL);
}
log.info("获取用户信息成功:" + userBody.toString());
Object mobile = userBody.get("mobile");
log.info("竹云登录用户电话为:" + mobile.toString());
//登录实现
UserAuthResult result = new UserAuthResult();
result.setSucess(false);
//这里编写自己的登录逻辑,判断是否登陆成功,并填写正确的返回类型和返回值
if (mobile != null) {
//当前返回类型手机,用户名,email,工号
result.setUserType(UserProperType.Mobile);
result.setUser(mobile);
result.setSucess(true);
}
if (result.isSucess()) {
log.info("登录成功:" + mobile);
return result;
}
}
loginFail(response, OAUTHCODE_URL, REQUEST_URL);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public void loginFail(HttpServletResponse response, String OAUTHCODE_URL, String SKIP_URL) {
try {
//拼接信息
String information = "&client_id=fmwelkin&response_type=code";
SKIP_URL = URLEncoder.encode(SKIP_URL, "UTF-8");
String redirectUrl = OAUTHCODE_URL + "?redirect_uri=" + SKIP_URL + information;
log.info("苍穹跳转至竹云 URL:" + redirectUrl);
response.sendRedirect(redirectUrl);
} catch (Exception e) {
e.printStackTrace();
}
}
}
5、竹云具体接口、参数说明
具体调用竹云接口方法,请参考《分众传媒统一身份认证WEB端OAUTH接入文档》
6、本地部署单点登录
1、登录mc,进入 “租户列表”,进入租户
2、进入租户后,先取消启用,保存,然后双击进入
3、注册插件:选择第三方认证,把插件全路径放上去,保存
4、退出,到租户页面保存。
5、进入“集群管理”,发布出去
苍穹开发说明---竹云单点登录
本文2024-09-16 22:05:49发表“eas cloud知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-eas-45896.html