最近新系统需要打通人员的组织结构和账号信息,A系统自建的用户体系而B系统是使用的Ldap账号体系,目前要整合账号体系把钉钉的人员组织架构同步到Ldap中,相关的内部系统都是基于OpenLdap进行身份验证,如果能和钉钉结合起来,会更好。

与钉钉的组织架构进行集成,可以想到的方法有如下:

采用钉钉的身份验证方式,集成到jira、confluence、gitlab等的验证体系中,这个可能涉及到多个应用系统的修改 - 后面可以验证下

同步钉钉的组织架构到本地的ldap,但是密码过不来,所以验证的时候,得看看能否修改ldap的密码验证机制,改为调用钉钉的身份验证 - 后面可以验证下,这个改动量适中

只是同步钉钉的组织架构到本地的ldap,但是密码之类的身份验证还是在ldap中做 - 这个改动量小,可以先做。

所以本人才去的方式是先做3,然后2,最后看1能不能做。

钉钉的开放平台
同步钉钉的组织架构主要用到钉钉的开放平台:https://ding-doc.dingtalk.com/?spm=a2115p.8777639.4570797.3.5e894260GZf6We,里面的注册之类,和一般的开放平台并无而异,此处不在赘述。

 

创建应用
后面我们以创建企业内部应用为例,介绍开放平台api使用方法。

登录开放平台之后,在 企业内部开发 - 小程序 - 创建应用:

 

 

然后输入应用的基本信息:

 

 

在下面的步骤中输入服务器的出口ip,这个是钉钉设定的防火墙白名单,如果ip不符合,则无法访问本应用:

 

 

创建完成之后,我们可以在应用开发处看到创建的应用:

 

 

点击新创建的小程序应用,查看应用的基本信息:

 

 

进去之后,可以看到开发需要的appid,appsecret等信息:

 

 

另外需要设置的是在接口权限里针对通讯录的设置:

 

 

这里有一个地方注意,授权范围是指能获取哪些人的信息:

 

 

至此,应用的创建完成,下面进入开发阶段。

同步钉钉的组织架构到本地ldap
推拉模型是分布式架构中的常见建构,钉钉同样提供了两种方式的支持。拉模型,适合我们做本地ldap的组织架构初始化或者补偿用,推模型适合在有员工入职或者离职时主动推送员工信息到本地ldap进行更新。

创建应用

首先我们从https://ding-doc.dingtalk.com/doc#/faquestions/vzbp02 下载sdk到本地,并在pom中增加引用:

<dependency>
    <groupId>com.dingtalk</groupId>
    <artifactId>taobao-sdk-java-auto</artifactId>
    <systemPath>D:/dev/dingding/taobao-sdk-java-auto_1479188381469-20200207.jar</systemPath>
    <scope>system</scope>
</dependency>
从https://github.com/injekt/openapi-demo-java.git 把代码clone下来,将如下路径代码拷贝到工程中D:\dev\dingding\openapi-demo-java\src\com\alibaba\dingtalk\openapi\demo\\utils\aes,并添加依赖:

<dependency>
    <groupId>commons-codec</groupId>
    <artifactId>commons-codec</artifactId>
    <version>1.14</version>
</dependency>
这个代码主要用于和钉钉交互时的解密和加密,以后用的着,大家知道就行了。

到此环境准备完毕,下面进入写代码阶段。

拉模型获取组织架构信息

从钉钉的文档上可以看到https://ding-doc.dingtalk.com/doc#/serverapi2/eev437,其api的调用第一步是获取token,后续api调用传入此token即可,具体的代码大家可以参考官网,这里就不赘述了。钉钉官网的文档做的还可以,有代码直接复制:)实际使用过程中,我们可以对进行换成,放在本地或者中都可以。在通过钉钉的api获取组织架构和用户信息之后,与本地ldap的账号信息进行比对,即可实现组织架构的同步。

推模型获取组织架构信息

下面使用推模型在钉钉端主动进行组织架构变更的推送。这个注意用到的是回调:https://ding-doc.dingtalk.com/doc#/serverapi2/pwz3r5。简单来讲,我们注册比如添加用户、移除用户的监听到钉钉,那么在有员工变动的时候,钉钉会发送消息到我们注册的url上,告诉我们具体变化的用户id,然后我们再调钉钉的用户api获取用户的具体信息更新的本地ldap即可。在回调这一块,就要用到上述的加密的解密了,关键代码如下:

@PostMapping("ding/callback")
public ResponseEntity callback(String signature, String timestamp, String nonce,@RequestBody String requestBody) throws Exception{
            DingTalkEncryptor encryptor = new DingTalkEncryptor(dingcallbackToken, dingCallbackAeskey, dingCorpid);

    JSONObject jsonEncrypt = JSON.parseObject(requestBody);
    //
    // 获取从encrypt解密出来的明文
    String encryptMessage  = encryptor.getDecryptMsg(signature, timestamp, nonce, jsonEncrypt.getString("encrypt"));

    JSONObject encryptJsonObject = JSON.parseObject(encryptMessage);
    String eventType = encryptJsonObject.getString("EventType");
    switch (eventType){
        case "check_url":
            log.info("回调测试url");
            break;
        case "user_add_org":
            log.info("新员工入职");
            break;
        case "user_leave_org":
            log.info("员工离职");
            break;
        case "org_dept_create":
            log.info("新部门创建");
            break;
        case "org_dept_remove":
            log.info("部门删除");
            break;
        default:
            break;
    }

    Map map = encryptor.getEncryptedMap("success", Long.parseLong(timestamp), nonce);
    String msg = JSON.toJSONString(map);
    log.info(msg);
    return new ResponseEntity(msg, HttpStatus.OK);

}
注意需要返回success消息给服务器从而说明此次回调成功。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐