记一次应用上架钉钉的过程

钉钉上架并免登

Posted by catmai on January 17, 2020

记一次应用上架钉钉的过程

最近客户的应用需要上架到钉钉方便查看和使用,我们采用的方案是H5微应用。上架到钉钉需要走很多流程,包括安装Htpps证书、接入钉钉稳定性平台以及免登录验证。

之前没有接触过钉钉的接入,这边特别记录一下。

安装SSL证书

安装Https证书自然是要申请证书的,我是直接拿到了证书和密钥了。(如果有需要但是不知道怎么申请的可以看一下阿里云的网站,可以免费申请一年的有效证书)申请下来之后根据自己的服务器类型下载证书,这边用的是tomcat所以证书下载下来后包含两个内容:一个pfx文件和一份txt密钥。

1.在Tomcat安装目录下新建cert目录,把证书(.pfx文件)丢进去 2.修改Tomcat配置文件(server.xml),找到Connector标签,这里是设置端口的地方。修改redirectPort属性(默认是8443),修改为443 3.添加如下代码

<Connector port="443"  
    protocol="HTTP/1.1"  
    SSLEnabled="true"  
    scheme="https"  
    secure="true"  
    keystoreFile="证书路径"  
    keystoreType="PKCS12"  
    keystorePass="证书密码"     
    clientAuth="false"  
    SSLProtocol="TLSv1+TLSv1.1+TLSv1.2"      ciphers="TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_256_CBC_SHA256"/>

4然后在Tomcat的web.xml中最后面添加

<login-config>  
    <!-- Authorization setting for SSL -->  
    <auth-method>CLIENT-CERT</auth-method>  
    <realm-name>Client Cert Users-only Area</realm-name>  
</login-config>  
<security-constraint>  
    <!-- Authorization setting for SSL -->  
    <web-resource-collection >  
        <web-resource-name >SSL</web-resource-name>  
        <url-pattern>/*</url-pattern>  
    </web-resource-collection>  
    <user-data-constraint>  
        <transport-guarantee>CONFIDENTIAL</transport-guarantee>  
    </user-data-constraint>  
</security-constraint>

这样会强制所有访问跳转到Https访问。

到这一步证书已经安装好了,启动Tomcat浏览器访问,如果地址前有一把小锁说明证书安装成功。

上架钉钉

1.上架钉钉需要一个钉钉的企业号,登录之后选择工作台。划到最下面,自建应用。
photo1
2.创建H5微应用。
photo2
按照要求填写应用名称,上传应用Logo,选择企业内部自主开发即可。
3.设置的第二页包括了应用首页地址,PC端后台地址还有管理后台地址等。这些都按实际情况填写。其中有一项,服务器出口IP。钉钉规定服务器出口IP不能被其他企业的应用占用,所以在填写的时候填应用部署在的服务器的IP地址。否则在配置免登的时候获取钉钉用户信息会返回异常信息。(errcode:60020)
4.设置完成之后,可以对应用进行发布,可以选择企业内部分成员可见或所有成员可见。可以选择接入钉钉稳定性管理平台,把下面的代码放到H5的js中就可以了。
photo3
平台可以监控系统的稳定性,和访问量还是不错的。
5.这些都设置完成之后,在手机登录钉钉,工作页面就可以看到上架的应用了。还是很方便的。

免登

一般自己的应用都会有一个单独的登录,但是在钉钉或者微信打开小程序/应用的时候就不希望用户再一次登录。或者说,除初次打开应用之后不需要再登录了。所以需要做免登陆。

我们应用的免登陆方案大体是这样的:获得钉钉用户的唯一标识和系统中用户关联。每次打开应用先获取钉钉用户信息,查询是否存在绑定的系统用户。如果存在根据系统用户的权限跳转到所属页面并且在后台为该用户登录(登录到我们自己的系统),如果不存在,跳转到系统登录页。登录成功后绑定钉钉用户和所登录的系统用户。

这样做可以设置免登陆的有效时间,有效时间过了可以让用户重新登录进行绑定。用户绑定的信息可以储存在数据库或者缓存中,看需求和实际情况选择。

所以现在的问题就是如何获得钉钉的用户信息。钉钉开发文档中写的还是比较详细的,接口也给出了。


1.获得免登授权码

查看钉钉开发文档,获取用户userid需要两个参数,免登授权按码和access_token 免登授权码需要在前端中获得,js如下。

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

执行这段js需要引入钉钉JSAPI 官方推荐使用npm安装到项目下 npm install dingtalk-jsapi --save 如果是浏览器引入,使用script标签

<script src="https://g.alicdn.com/dingding/dingtalk-jsapi/2.7.13/dingtalk.open.js"></script>

获取免登授权码的corpid为该应用所在企业的corpid,在钉钉开放平台的首页查看。 引入完成之后,就可以获得免登授权码,是随机的,即用即获取。


2.获得access_token

通过以上操作可以获得免登授权码了,还需要access_token access_token需要在后端获取,下载钉钉给出的jar包。

taobao-sdk.jar和taobao-sdk-source.jar 引入项目

获得access_token代码如下

DingTalkClient client = new DefaultDingTalkClient(method);
OapiGettokenRequest req = new OapiGettokenRequest();
req.setAppkey(appKey);
req.setAppsecret(appSecret);
req.setHttpMethod("GET");
OapiGettokenResponse rsp = client.execute(req);
return rsp.getBody();  

method为获取access_token的接口地址 https://oapi.dingtalk.com/gettoken
appKey和appSecret是两个关键的参数。在钉钉应用管理页面查看应用的基本信息可以看到。 photo4

返回的OapiGettokenResponse对象内保留了接口返回的信息。body内是access_token以及其有效时长。


3.获得用户信息

到目前我们已经拿到了免登授权码和access_token接下来获得用户信息,话不多说直接上代码emmm

DingTalkClient client = new DefaultDingTalkClient(method);
OapiUserGetuserinfoRequest req = new OapiUserGetuserinfoRequest();
req.setCode(code);
req.setHttpMethod("GET");
OapiUserGetuserinfoResponse rsp = client.execute(req, access_token);
return rsp.getBody();

还是一样,先建立一个客户端实例,然后请求体的类有所不同(同理返回体的类也不同)
客户端构造方法的接口地址是 https://oapi.dingtalk.com/user/getuserinfo
请求参数code就是前端获得的免登授权码
返回的response中包含了用户的基本信息,包括姓名,id,设备编号和岗位。

获得了用户信息之后就基本大功告成了。 值得注意的是,在获得用基本信息的时候可能会出现上文提到的错误信息,即应用出口ip和实际访问的ip不一致导致获取失败。

结语

上架钉钉的事情已经基本完成了,还有其他花里胡哨的操作目前还没有借出,如果以后有机会这次经历应该还是有参考价值的。