钉钉免登相关操作

在测试钉钉H5界面时,涉及到钉钉免登,故记录以备不时之需。

前端需要进行的操作:
1、安装钉钉h5客户端SDK

npm install dingtalk-jsapi

或者 yarn

yarn add dingtalk-jsapi

2、前端获取免登码

import * as dd from 'dingtalk-jsapi';

dd.ready(function() {		
	dd.runtime.permission.requestAuthCode({
	  corpId: 'dingxxxxxx', // 企业id
	  onSuccess: (info) => {
	   console.log('info', info)
	   const code = info.code // 通过该免登授权码可以获取用户身份

	  // 发送请求到后端接口
          axios.post('/login', {
             code: code
          })
         .then(function (response) {
           console.log(response);
         })
        .catch(function (error) {
           console.log(error);
         });
       },
	onFail: (err) => {
	    console.log('requestAuthCode err', err)
        }
    });
});

3、后端通过免登码获取用户信息

String appkey = 'xxxxxxxxxxxxx';
String appSecret = 'xxxxxxxxxxx';

    /**
     * 获取token
     *
     * @return 钉钉token
     */
    public String accessToken() throws Exception {
            // 客户端配置
            Config config = new Config();
            config.setProtocol("https");
            config.setRegionId("central");

            // 创建客户端
            Client client = new Client(config);
            // 请求接口
            GetAccessTokenRequest getAccessTokenRequest = new GetAccessTokenRequest()
                    .setAppKey(appKey) // 企业内部应用 Appkey
                    .setAppSecret(appSecret); // 企业内部应用 AppSecret
            try {
                // 获取 AccessToken
                GetAccessTokenResponse accessTokenResponse = client.getAccessToken(getAccessTokenRequest);
                token = accessTokenResponse.getBody().getAccessToken();
            } catch (TeaException err) {
                if (!Common.empty(err.code) && !Common.empty(err.message)) {
                    // err 中含有 code 和 message 属性,可帮助开发定位问题
                    throw new RuntimeException(StrUtil.format("Request access token error: {}", err.message));
                }

            } catch (Exception _err) {
                TeaException err = new TeaException(_err.getMessage(), _err);
                if (!Common.empty(err.code) && !Common.empty(err.message)) {
                    // err 中含有 code 和 message 属性,可帮助开发定位问题
                    throw new RuntimeException(StrUtil.format("Request access token error: {}", err.message));
                }

            }
        return token;
    }


    /**
     * 获取用户id
     *
     * @param authCode    免登录授权码
     * @param accessToken accessToken
     */
    public String getUserId(String authCode, String accessToken) {
        DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/user/getuserinfo");
        OapiV2UserGetuserinfoRequest req = new OapiV2UserGetuserinfoRequest();
        req.setCode(authCode);
        try {
            OapiV2UserGetuserinfoResponse rsp = client.execute(req, accessToken);
            if (rsp.isSuccess()) {
                OapiV2UserGetuserinfoResponse.UserGetByCodeResponse userGetByCodeResponse = rsp.getResult();
                log.debug("用户信息: {}", userGetByCodeResponse);
                return userGetByCodeResponse.getUserid();
            } else {
                throw new RuntimeException(rsp.getErrmsg());
            }
        } catch (ApiException e) {
            throw new RuntimeException(e);
        }
    }

   /**
     * 根据userId获取用户信息
     *
     * @param userId      用户id (钉钉内部用户ID)
     * @param accessToken accessToken
     */
    public OapiV2UserGetResponse.UserGetResponse getOapiV2UserGetResponseByUserId(String userId, String accessToken) {
        DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/user/get");
        OapiV2UserGetRequest req = new OapiV2UserGetRequest();
        req.setUserid(userId);
        req.setLanguage("zh_CN");
        try {
            OapiV2UserGetResponse rsp = client.execute(req, accessToken);
            if (rsp.isSuccess()) {
                return rsp.getResult();
            } else {
                throw new RuntimeException(rsp.getErrmsg());
            }
        } catch (ApiException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 钉钉免登录获取用户信息
     *
     * @param authCode 免登录授权码
     */
    public OapiV2UserGetResponse.UserGetResponse getUserInfo(String authCode) throws Exception {
        // 1. 获取access_token
        String accessToken = accessToken();

        // 2. 获取用户ID
        String userId = getUserId(authCode, accessToken);

        // 2. 根据用户ID获取用户详情
        return getOapiV2UserGetResponseByUserId(userId, accessToken);
    }

4、通过获取到的用户信息,结合自身相关业务,完成用户登录。

posted @ 2025-02-05 19:24  丹恪梦  阅读(267)  评论(0)    收藏  举报