钉钉H5免登录流程前后端实现

发布于:2022-12-07 ⋅ 阅读:(1342) ⋅ 点赞:(1)

这里简单介绍一下实现过程和整合后的代码,官网的代码比较分散,新手看起来有点困难

免登流程

免登是指用户进入应用后,无需输入钉钉用户名和密码,应用程序可自动获取当前用户身份,进而登录系统的流程。

获取微应用免登授权码

使用以下代码获取免登授权码(调用此api不需要进行鉴权,即不需要进行dd.config)。获取的免登授权码有效期5分钟,且只能使用一次。接口说明,请参考获取微应用免登授权码

说明 第三方企业应用可以在微应用的首页URL中使用$CORPID$做为参数占位符,钉钉容器会将$CORPID$替换为当前访问用户的企业corpId。

例如,微应用首页地址为https://www.dingtalk.com,需要获取当前访问用户的企业corpId值,微应用首页地址可改为https://www.dingtalk.com?corpId=$CORPID$。在进入该首页地址页面时,使用js方法获取当前页面URL,即可获取corpId值。

CORPID获取

c6e3dc15a4a645139a6982537c34c62f.png

地址配置

f9f5ec8efb5b417585aea126193f51ba.png

 前端实现代码,移动端和PC端可以用同样的代码实现

	<script type="text/javascript">
		function GetQueryString(name)
				{
					var reg = new RegExp("(^|&)"+ name +"=([^&]*)(&|$)");
					var r = window.location.search.substr(1).match(reg);
					if(r!=null)return unescape(r[2]); return null;
				}
		dd.runtime.permission.requestAuthCode({
			corpId: GetQueryString("corpId"),
			onSuccess: function(result) {
				console.log(result)
			//	$("#userName").text(JSON.stringify(result));
				//获取当前用户信息
				getUserInfo(result.code)
			},
			onFail: function(err) {
				console.log(err)
			}

		})

		function getUserInfo(code) {
			$.ajax({
				async: false, //同步,异步
				url: "获取用户信息的接口地址", //请求的服务端地址
				data: {
					code: code,
				},
				type: "post",
				success: function(datas) {
					//成功之后的处理,返回的数据就是 data
					$("#userId").text(JSON.stringify(datas));
					//进行登录逻辑处理
					
				},
				error: function() {
					alert(e); //错误的处理
				}
			});
		}
	</script>

后端获取登录用户信息的接口代码

调用过程和步骤

 这里的代码是自己封装的框架,不必完全照抄,可按照自己实际情况进行参数接收和处理即可,主要关注中间部分

    @MethodAnnotation(method = "getUserInfo", methodWay = "ALL", methoddes = "获取钉钉用户信息")
    public void getUserInfo(HttpServletRequest request, HttpServletResponse response) throws Exception {
    	String authCode=request.getParameter("code");
    	 // 1. 获取access_token
        String accessToken = TestDingDing.getAccessToken();
        
		// 2. 获取用户ID
        String userId = getUserId(authCode, accessToken);
         //3. 获取用户详情
        UserGetResponse r = getOapiV2UserGetResponseByUserId(userId, accessToken);
        System.out.println(JSON.toJSONString(r));
        
        qury(request, response, r, false, 0);
    }

获取授权token 

	
	public static String getAccessToken() {
        try {
			return (JSON.parseObject(getAccessTokenJSON())).getString("access_token");
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}
	private static String getAccessTokenJSON() {
        try {
			String token = HttpClient.doGetStr(access_token_url.replaceAll("_appkey", appkey).replaceAll("_appsecret", appsecret));
			return token;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

 根据授权码和accessToken获取用户ID信息

    /**
     * 根据authCode获取用户ID
     *
     * @param authCode
     * @param accessToken
     * @return
     */
    private static String getUserId(String authCode, String accessToken) {
        DingTalkClient client = new DefaultDingTalkClient(GET_USER_INFO_URL);
        OapiV2UserGetuserinfoRequest req = new OapiV2UserGetuserinfoRequest();
        req.setCode(authCode);
        OapiV2UserGetuserinfoResponse oapiV2UserGetuserinfoResponse;
        try {
            oapiV2UserGetuserinfoResponse = client.execute(req, accessToken);
            if (oapiV2UserGetuserinfoResponse.isSuccess()) {
                OapiV2UserGetuserinfoResponse.UserGetByCodeResponse userGetByCodeResponse = oapiV2UserGetuserinfoResponse.getResult();
                return userGetByCodeResponse.getUserid();
            } else {
                System.out.println(oapiV2UserGetuserinfoResponse.getErrcode()+oapiV2UserGetuserinfoResponse.getErrmsg());
            }

        } catch (ApiException e) {
            // 需要自己处理异常
            e.printStackTrace();
        }
		return null;
    }

 根据用户ID信息获取钉钉用户详情

    /**
     * 根据用户ID获取用户详情
     *
     * @param userId
     * @param accessToken
     * @return
     */
    private static OapiV2UserGetResponse.UserGetResponse getOapiV2UserGetResponseByUserId(String userId, String accessToken) {
        DingTalkClient client = new DefaultDingTalkClient(USER_GET_URL);
        OapiV2UserGetRequest req = new OapiV2UserGetRequest();
        req.setUserid(userId);
        req.setLanguage("zh_CN");

        try {
            OapiV2UserGetResponse oapiV2UserGetResponse = client.execute(req, accessToken);
            if (oapiV2UserGetResponse.isSuccess()) {
                return oapiV2UserGetResponse.getResult();
            } else {
            	  System.out.println(oapiV2UserGetResponse.getErrcode()+oapiV2UserGetResponse.getErrmsg());
            }
        } catch (ApiException e) {
            // 需要自己处理异常
            e.printStackTrace();
        }
		return null;
    }

接下来将数据返回给前端,前端根据身份信息做登录的业务逻辑处理

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到