苍穹开发说明---竹云单点登录

栏目:eas cloud知识作者:金蝶来源:金蝶云社区发布:2024-09-16浏览:1

苍穹开发说明---竹云单点登录

竹云单点登录接口文档

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、竹云具体接口、参数说明

具体调用竹云接口方法,请参考《分众传媒统一身份认证WEBOAUTH接入文档》

 

6、本地部署单点登录

1、登录mc,进入 “租户列表”,进入租户

 

 

2、进入租户后,先取消启用,保存,然后双击进入

 

 

 

3、注册插件:选择第三方认证,把插件全路径放上去,保存

 

4、退出,到租户页面保存。

5、进入“集群管理”,发布出去

 


苍穹开发说明---竹云单点登录.docx

苍穹开发说明---竹云单点登录

竹云单点登录接口文档1、功能介绍用户通过竹云界面,输入账号密码,通过该账号绑定的苍穹用户,跳转到苍穹页面。2、流程概述1、访问苍穹系...
点击下载文档
分享:
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息