基于ASP.NET CORE MVC 3.1的钉钉企业H5微应用开发(2)--免登

前言

这是介绍使用ASP.NET CORE   MVC 3.1  进行开发的第二篇文章,主要介绍免登流程

免登

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

常见应用场景:获取用户身份,发送工作消息;获取用户信息进行分组好管理;获取用户身份,进行表单的提交。包括某些访问的授权等。

主要流程

(1)获取微应用免登授权码

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

ps:这一段代码需要在钉钉的运行环境中才能生效,简单来说,需要进行真机调试,只是单纯的在网页中,打卡是无法获取到code的。前端接口调试环境详情:https://ding-doc.dingtalk.com/doc#/kn6zg7/qg4y64

dd.ready(function() {
    dd.runtime.permission.requestAuthCode({
        corpId: _config.corpId, // 企业id,创建应用时自动生成的,可登录开发者后台查看
        onSuccess: function (info) {
                  code = info.code // 通过该免登授权码可以获取用户身份
        }});
});

这一步将会的到一个字符串类型的免登授权码,得到以后需要向后端传送该code。

(2)获取access_token

调试工具:在线调试

请求方式:GET(HTTPS)

请求地址https://oapi.dingtalk.com/gettoken?appkey=key&appsecret=secret

参数说明

参数

类型

必须

说明

appkey

String

应用的唯一标识key

appsecret

String

应用的密钥

创建的应用以后,会得到appKey和appSecrect,假如没创建,请移步https://ding-doc.dingtalk.com/doc#/serverapi2/eev437。

获取access_token,需要在服务端进行,在.net core 中的使用具体如下:(注意注释部分)

 public string GetAuthToken()
        {
            IDingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/gettoken");
            OapiGettokenRequest request = new OapiGettokenRequest();
            //这里直接安装dingtalk .net core 版本的sdk会报错,可以将配置方法改成使用using 
           //Microsoft.Extensions.Configuration;并在appseting.json中配置即可
            request.Appkey = Configuration["Appkey"];
            request.Appsecret = Configuration["Appsecret"];

            request.SetHttpMethod("GET");
            OapiGettokenResponse response = client.Execute(request);

            return response.AccessToken;
        }

(3)获取用户userid

调试工具:在线调试

请求方式:GET(HTTPS)

请求地址:https://oapi.dingtalk.com/user/getuserinfo?access_token=access_token&code=code

参数说明

参数

类型

必须

说明

access_token

String

调用接口凭证

code

String

免登授权码,参考上述“获取免登授权码”

返回结果

{
    "userid": "****",
    "sys_level": 1,
    "errmsg": "ok",
    "is_sys": true,
    "errcode": 0
}

 

通过免登授权码和access_token获取用户的userid。免登授权码需要从钉钉运行环境下的前端获取。

前端代码可以参考如下,我这里使用了Jquery ajax.

   dd.ready(function () {
            // dd.ready参数为回调函数,在环境准备就绪时触发,jsapi的调用需要保证在该回调函数触发后调用,否则无效。

            dd.runtime.permission.requestAuthCode({
                corpId: _config.corpid,
                onSuccess: function (result) {
                    //通过corpId,code获取userid,code为string类型
                    var code = result.code;
                    //alert(code)

                    $.ajax({
                        async: false,
                        type: 'get',
                        contentType: "application/json;charset=UTF-8",
                        datatype: "",
                        data: { "code": code },
                       //后端接收code获取userid的方法GetuserInfo
                        url: '/DingTalk/GetUserInfo',
                        success: function (ref) {
                            alert(ref),

                        },
                    })

                },

                onFail: function (err) {
                    alert(JSON.stringify(err));

                }

            });

服务的.net core 代码

       //获取钉钉用户id
         public string UserId;

        public string GetUserInfo(string code)
        {
            IDingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/user/getuserinfo");
            OapiUserGetuserinfoRequest req = new OapiUserGetuserinfoRequest();
            //判断code是否为空,返回消息方便调试
            if (string.IsNullOrEmpty(code))
            {
                return "空code";
            }
            req.Code = code;
            req.SetHttpMethod("GET");
            //判断token是否为空,返回消息方便调试
            string token = GetAuthToken();
            if (string.IsNullOrEmpty(token))
            {
                return "空token";
            }
            OapiUserGetuserinfoResponse rsp = client.Execute(req, token);
            if (!string.IsNullOrEmpty(rsp.Userid))
            {
                UserId = rsp.Userid;
              
                //所有参数不为空则调用发送信息方法,下次再讲解
                SendWrokMsg(rsp.Userid);
            }
            return rsp.Body;
        }

这里首先要保证,能够准确获取到code以及token。

假如前端报错,也就是执行了onFail: function (err) {}方法,报错信息如下:访问IP不在白名单之中。

当请求开放平台服务端接口遇到“访问IP不在白名单”问题时,表示您的请求IP不在该应用出口IP白名单内。

可以按照以下方式排查并修改:

(1)对比调用接口的应用中的AppKey值,与报错信息中返回的AppKey值是否一致。如果不一致,可能是由于AppKey或者AppSecret使用的是其他的,导致在获取AccessToken值时会提示错误。

注意:如果错误信息中返回的是CorpId值,说明创建应用时间较早,添加IP的路径为:登录开发者后台-基本信息-开发信息旧版-找到该应用使用的CorpSecret值,点击设置修改IP;如果当前账号按照上述路径查看不到CorpSecret,需要该企业主管理员账号查看并修改IP

(2)如果应用中的AppKey值跟报错信息中返回的AppKey值是一致的,解决办法是将报错信息中的request IP添加到该应用的出口IP里面。

这个问题经常出现在当你用手机调试,并且你的笔记本连接手机WiFi时,就会出现这样的问题

所有的代码都跑通时,在钉钉运行相应的页面时会弹出响应的具体信息。

真机调试如图:

基于ASP.NET CORE MVC 3.1的钉钉企业H5微应用开发(2)--免登_第1张图片

总结

本文主要介绍了在ASP.NET CORE 3.1平台下进行钉钉免登流程,下一次预计会讲消息通知啥的。。。

 

 

 

 

你可能感兴趣的:(钉钉H5微应用,javascript,asp.net)