在这里记录一下我配置的钉钉接入微应用遇到的坑。搞了我几天天才调通。头皮发麻,现在梳理一下,以免别人也入坑。

1.钉钉接入主要要获取钉钉企业员工的ID,然后去自己的应用的数据库里进行匹配然后实现免登陆的操作。

2.这里面主要有2个重要操作:一个是鉴权,一个是免登。如果只是简单的免登操作,其实不需要鉴权的,鉴权的目的是为了可以调用其他jsapi接口使用钉钉其他接口。

3.如果要鉴权,要放在免登操作的前面。

4.下面是钉钉上文档找来的图片,这张图的已经有点落伍了,图上的CorpSecret已经没有了。获取Token已经变成通过AgentId和AppSecret来获得,具体看下文。

5.下面来说一下从头到位的具体流程

  a.首先登陆钉钉创建应用,获取到4个我们要用到的重要的值:corpId,AgentId,AppKey,AppSecret, 这个四个值分别为企业ID,应用ID,应用Key,应用密钥。

  b.我们来说下这个四个值的作用:企业ID corpId 是为了获取Code码,Code码是为了获取到用户的基础信息UserId,然后通过UserId,就可以获取到完整的信息。AppKey和AppSecret是为了获取Token值,前面Code 和userId要获取用户的信息必须要和Token一起才能获取用户信息。

6.现在来看一下具体的获取Token操作

  

        public string GetDingToken()
{
string token = string.Empty;
if (string.IsNullOrEmpty(token))
{
string url = string.Format("https://oapi.dingtalk.com/gettoken?corpid={0}&corpsecret={1}", _appId, _appSecret);
string json = HttpHelper.GetDataGetHtml(url);//HTTP请求的帮助类,这个类跟本文没有关系,就不贴上来了。
Access_Token access_token = JsonHelper.JsonDeserialize<Access_Token>(json);
token = access_token.access_token;
}
return token;
}

7.获取通过Code基础信息的操作(获取的信息非常有限只有一个userId有用为了获取整个用户的信息)

        public Access_UserInfo GetUserInfo(string code)
{
string url = string.Format("https://oapi.dingtalk.com/user/getuserinfo?access_token={0}&code={1}", GetDingToken(), code);
string json = HttpHelper.GetDataGetHtml(url);
return JsonHelper.JsonDeserialize<Access_UserInfo>(json);
}

8.通过 userId获取钉钉用户信息的操作(关于免登陆的操作相关的后台代码就这些了,剩下还有鉴权相关的一些代码后台代码和前台获获取Code的一些前端请求代码)

  

        public DingUser GetUeser(string uid)
{
string url = string.Format("https://oapi.dingtalk.com/user/get?access_token={0}&userid={1}", GetDingToken(), uid);
string json = HttpHelper.GetDataGetHtml(url);
return JsonHelper.JsonDeserialize<DingUser>(json);
}

9.鉴权的前端配置代码(这里要先引用钉钉JS文件,以前区分手机可客户端后来不区分了)

dd.config({
agentId: '', // 必填,微应用ID
corpId: '',//必填,企业ID
timeStamp: , // 必填,生成签名的时间戳
nonceStr: '', // 必填,生成签名的随机串
signature: '', // 必填,签名
type:0/1, //选填。0表示微应用的jsapi,1表示服务窗的jsapi;不填默认为0。该参数从dingtalk.js的0.8.3版本开始支持
jsApiList : [
'runtime.info',
'biz.contact.choose',
'device.notification.confirm',
'device.notification.alert',
'device.notification.prompt',
'biz.ding.post',
'biz.util.openLink',
] // 必填,需要使用的jsapi列表,注意:不要带dd。
});

 这个几个的参数说明上面已经有备注,这些需要从后台返回这些参数。agentId,和CorpId是现成的,timeStamp生成一个就好了,nonceStrye也是随机生成的一个编码,

,主要是signature是需要几个参数拼成一起生成的。下面看看鉴权的后台代码(signature需要ticket+noncestr+timestamp+当前url一起生成)JSAPI鉴权官方文档

下面是NET实现的代码

        private Access_Sdk GetSdk(string url)
{ string noncestr = GuidTo16String();
string timestamp = DateTime.Now.Ticks.ToString();
Access_Ticket access_Ticket = GetTicket();
string str1 = "jsapi_ticket=" + access_Ticket.ticket + "&noncestr=" + noncestr + "&timestamp=" + timestamp + "&url=" + url + "";
string signature = str1.Sha1();
Access_Sdk sdk = new Access_Sdk();
sdk.Noncestr = noncestr;
sdk.Timestamp = timestamp;
sdk.Signature = signature;
return sdk;
}

这段代码主要有2个要说明的地方一个就是生成Ticket,一个就是 Sha1进行编码。

生成Ticket的编码

        private Access_Ticket GetTicket()
{
string url = string.Format("https://oapi.dingtalk.com/get_jsapi_ticket?access_token={0}", GetDingToken());
string json = HttpHelper.GetDataGetHtml(url);
return JsonHelper.JsonDeserialize<Access_Ticket>(json);
}

sha1加密

        public static string Sha1(this string str)
{
var buffer = Encoding.UTF8.GetBytes(str);
var data = SHA1.Create().ComputeHash(buffer); var sb = new StringBuilder();
foreach (var t in data)
{
sb.Append(t.ToString("X2"));
} return sb.ToString().ToLower();
}

后台的主要代码我都贴上了,下面贴下前台的获取Code的代码

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

到这里就结束了,本来想写的详细点,但是感觉还挺难得,其实这个东西不难,主要是第一次搞的时候,没有清楚的文档,遇到一两个坑很烦人。心态都爆炸了。

后面我尽量放一份完整的demo实例上来,说的不清楚的大家可以留言,我一定会回复的。

钉钉微应用接入钉钉免登陆配置记录。NET实现的更多相关文章

  1. Linux SSH免登陆配置步骤

    [jans@centos2 ~]# cd ~[jans@centos2 ~]# ssh-keygen -t rsa  //生成rsa加密的公钥和密钥[jans@centos2 ~]# cat .ssh ...

  2. 分布式监控系统Zabbix3.4-钉钉告警配置记录

    群机器人是钉钉群的高级扩展功能,群机器人可以将第三方服务的信息聚合到群聊中,实现自动化的信息同步.例如:通过聚合GitHub,GitLab等源码管理服务,实现源码更新同步:通过聚合Trello,JIR ...

  3. [linux]阿里云主机的免登陆安全SSH配置与思考

    公司服务器使用的第三方云端服务,即阿里云,而本地需要经常去登录到服务器做相应的配置工作,鉴于此,每次登录都要使用密码是比较烦躁的,本着极速思想,我们需要配置我们的免登陆. 一 理论概述 SSH介绍 S ...

  4. 烂泥:数据库管理之phpmyadmin免密码配置

    本文由ilanniweb提供友情赞助,首发于烂泥行天下 想要获得更多的文章,可以关注我的微信ilanniweb 其实这篇文章很早就想写了,但是一直没有时间.刚好今天下午稍微空了点,就把这篇文章整理出来 ...

  5. Linux2 在Linux(CentOS)上配置SSH免登陆

    前言:      本文主要是我在安装hadoop之前,需要先配置SSH免登陆.通过网上搜索,发现不少类似的资料,但多少都有些小问题,所以结合自己的实践,记录在此,作为参考.如果能帮助到其他人,自然是更 ...

  6. 2015.4.21 实现一般免登陆,微博QQ分享,字体自适应等

    1.实现一般的登录验证和免登陆: 解决方法:node方法代码,nodeJS实现的session模块,不完整,但能用,仅供参考. 语言无所谓,session的机制都是一样的,实现不一样而已,:   2. ...

  7. [saiku] 免登陆进入管理后台

    上一篇分析了介绍了如何简化和修改saiku的界面[http://www.cnblogs.com/avivaye/p/4877882.html] 这一篇说明下如何去掉免登陆进入saiku 管理台 1.修 ...

  8. MySQL 5.7.9 免安装配置

    MySQL 5.7.9 免安装配置 环境:win10 64位 mysql版本:mysql-5.7.9-winx64.zip (http://dev.mysql.com/downloads/mysql/ ...

  9. Mysql在windows下的免安装配置步骤和重新安装的步骤

    windows下mysql免安装配置 1. 下载mysql免安装压缩包 下载mysql-5.6.22-winx64.zip 解压到本地D:\mysql-5.6.22-winx64 2. 修改配置文件 ...

随机推荐

  1. C# GDI绘制仪表盘(纯代码实现)

    纯代码实现GDI绘制仪表盘,效果在代码下面. public partial class HalfDashboardUc : UserControl { /// <summary> /// ...

  2. 利用bootstrap上传视频文件,mvc做后台处理

    @{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewport&quo ...

  3. JS弹出对话框函数alert(),confirm(),prompt()

    1,警告消息框alert() alert 方法有一个参数,即希望对用户显示的文本字符串.该字符串不是 HTML 格式.该消息框提供了一个“确定”按钮让用户关闭该消息框,并且该消息框是模式对话框,也就是 ...

  4. Elasticsearch安装与环境配置

    Elasticsearch安装与环境配置 确保机器上已经安装了jdk7以上版本 下载:官网下载地址:https://www.elastic.co/downloads/elasticsearch 将下载 ...

  5. java的几种定时任务

    本篇博文主要是讲述2.x 版本的quartz下的实现方案,1.x 版本的实现方式大致原理一致,但是具体的实现方式有些不一致,具体体现在获取  scheduler 这个类的方式上有些不同,这里不作过多的 ...

  6. 用c语言实现三子棋

    1 game.c://实现三子棋的.c文件 #define _CRT_SECURE_NO_WARNINGS #include"game.h" void init_board(cha ...

  7. 2019CVPR《Mask Scoring R-CNN》

    题目:<Mask Scoring R-CNN> CVPR 2019 Oral Paper(2017年783篇论文,获得口头报道的有215篇,oral paper很有含金量) 华中科技大学h ...

  8. 【bzoj2961】共点圆 k-d树

    更新:此题我的代码设置eps=1e-8会WA,现在改为1e-9貌似T了 此题网上的大部分做法是cdq分治+凸包,然而我觉得太烦了,于是自己口胡了一个k-d树做法: 加入一个圆$(x,y)$,直接在k- ...

  9. AngularJS入门之Services

    关于AngularJS中的DI 在开始说AngularJS的Service之前,我们先来简单讲讲DI(Dependency Injection,通常中文称之为“依赖注入”). DI是一种软件设计模式, ...

  10. 聚类系数可变无标度网络模型Holme-Kim HK模型

    # -*- coding: cp936 -*- import random import networkx as nx from networkx.generators.classic import ...