企业 OA绑定阿里钉钉
需求:
- 从钉钉进入OA,要实现免登,
- 在OA系统内部的审批消息,要及时发送到对应的钉钉用户(工作消息通知)
大概流程:
1、应用定义为:企业内部开发——微应用
2、创建微应用:在钉钉后台管理中创建微应用,获取开发微应用和必要参数。
CORP_ID :企业id,
CORP_SECRET:企业秘钥,
agentid:应用标识id
3、确定OA的开发语言和方式。本次OA的服务端采用spring boot,前端是vue+jquery
4、服务端引入钉钉的SDK,前端引入钉钉的js文件(开发文档上都有包)
钉钉业务逻辑:
钉钉免登din业务逻辑:
根据微应用的参数获取access_token,
根据accesss_token可以获取到在顶顶应用内的userid,
根据access_token+userid,获取jsapi_ticket,在用随机数nonceStr+时间timeStam+jsapi_ticket计算出签名信息sign
将jsapiticke,sign ,nonceSt,timeStamp,CORP_ID,agentid,六个参数,通过接口从后端发送给前端,由前端进行鉴权。
鉴权通过后,前端可以拿到code免登授权码,通过ajax传给后端
后端通过钉钉接口+ccess_token+code,可以获取到用户的userid,
后端通过钉钉接口+ccess_token+code+userid,获取到用户详情,最重要的就是mobile和userid,这两个值必须通过接口传给前端,其他参数可以不要。
在OA系统数据库用户表新增DING_USERID字段
前端把mobile和userid通过ajax请求发送给后端接口,接口通过mobile去查询OA系统的数据库用户表,若mobile存在,则将userid插入用户表此条用户信息中,同时返回此用户的“用户名”和“密码”。
前端将“用户名”和“密码”通过ajax,传给login接口,login接口判断用户信息是否准确。
PS:这里有个问题就是,在用户注册时,密码存入数据库前已经经过simpleHash加密算法,因此前面后端返回的“密码”已经是加密密码了,如果直接登录肯定是错误的。
simpleHash方法是一种单向散列算法,里面用了MD5,就意味着从明文可以得到散列值,而散列值不可以还原为明文,理论上不可逆,不能进行解密操作。
到这里,无路可退了,要么换一种能加密解密的算法,要么继续在password上想办法了·····
受智商压制,我选择后种。我选择在前端将“密码”发给后端时,对密码做一个判断,string password长度为40时,此时发过去的密码已经是加密过的,不需要在此加密,如果不是40,会将密码继续按照存密码时用的hash算法在hash一次,并于数据库中的hash值作比较。