钉钉微应用接入钉钉免登陆配置记录。NET实现
在这里记录一下我配置的钉钉接入微应用遇到的坑。搞了我几天天才调通。头皮发麻,现在梳理一下,以免别人也入坑。
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 + "×tamp=" + 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实现的更多相关文章
- Linux SSH免登陆配置步骤
[jans@centos2 ~]# cd ~[jans@centos2 ~]# ssh-keygen -t rsa //生成rsa加密的公钥和密钥[jans@centos2 ~]# cat .ssh ...
- 分布式监控系统Zabbix3.4-钉钉告警配置记录
群机器人是钉钉群的高级扩展功能,群机器人可以将第三方服务的信息聚合到群聊中,实现自动化的信息同步.例如:通过聚合GitHub,GitLab等源码管理服务,实现源码更新同步:通过聚合Trello,JIR ...
- [linux]阿里云主机的免登陆安全SSH配置与思考
公司服务器使用的第三方云端服务,即阿里云,而本地需要经常去登录到服务器做相应的配置工作,鉴于此,每次登录都要使用密码是比较烦躁的,本着极速思想,我们需要配置我们的免登陆. 一 理论概述 SSH介绍 S ...
- 烂泥:数据库管理之phpmyadmin免密码配置
本文由ilanniweb提供友情赞助,首发于烂泥行天下 想要获得更多的文章,可以关注我的微信ilanniweb 其实这篇文章很早就想写了,但是一直没有时间.刚好今天下午稍微空了点,就把这篇文章整理出来 ...
- Linux2 在Linux(CentOS)上配置SSH免登陆
前言: 本文主要是我在安装hadoop之前,需要先配置SSH免登陆.通过网上搜索,发现不少类似的资料,但多少都有些小问题,所以结合自己的实践,记录在此,作为参考.如果能帮助到其他人,自然是更 ...
- 2015.4.21 实现一般免登陆,微博QQ分享,字体自适应等
1.实现一般的登录验证和免登陆: 解决方法:node方法代码,nodeJS实现的session模块,不完整,但能用,仅供参考. 语言无所谓,session的机制都是一样的,实现不一样而已,: 2. ...
- [saiku] 免登陆进入管理后台
上一篇分析了介绍了如何简化和修改saiku的界面[http://www.cnblogs.com/avivaye/p/4877882.html] 这一篇说明下如何去掉免登陆进入saiku 管理台 1.修 ...
- MySQL 5.7.9 免安装配置
MySQL 5.7.9 免安装配置 环境:win10 64位 mysql版本:mysql-5.7.9-winx64.zip (http://dev.mysql.com/downloads/mysql/ ...
- Mysql在windows下的免安装配置步骤和重新安装的步骤
windows下mysql免安装配置 1. 下载mysql免安装压缩包 下载mysql-5.6.22-winx64.zip 解压到本地D:\mysql-5.6.22-winx64 2. 修改配置文件 ...
随机推荐
- linux 修改MTU值
Linux系统还可以通过如下方式查看.修改MTU值. 查看:cat /sys/class/net/eth0/mtu 设置:echo "1460" > /sys/class/n ...
- Cordova - XCode10编译热更新插件错误解决方法!
操作系统:OSX10.14 XCode:10.1 热更新插件:https://github.com/nordnet/cordova-hot-code-push 这个热更新插件,在安卓下编译,没有问题, ...
- 诸神眷顾的幻想乡(zjoi2015,bzoj3926)(广义后缀自动机)
幽香是全幻想乡里最受人欢迎的萌妹子,这天,是幽香的2600岁生日,无数幽香的粉丝到了幽香家门前的太阳花田上来为幽香庆祝生日. 粉丝们非常热情,自发组织表演了一系列节目给幽香看.幽香当然也非常高兴啦. ...
- BZOJ 1002--[FJOI2007]轮状病毒(高精度)
1002: [FJOI2007]轮状病毒 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 6858 Solved: 3745[Submit][Statu ...
- 聊聊并发(三)Java线程池的分析和使用
1. 引言 合理利用线程池能够带来三个好处.第一:降低资源消耗.通过重复利用已创建的线程降低线程创建和销毁造成的消耗.第二:提高响应速度.当任务到达时,任务可以不需要的等到线程创建就能立即执行. ...
- Java并发编程之final域的内存语义
一.final域的重排序规则 对于final域,编译器和处理器要遵循两个重拍序规则: 1.在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序 ...
- ehcache 页面整体缓存和局部缓存
页面缓存是否有必要?. 这样说吧,几乎所有的网站的首页都是访问率最高的,而首页上的数据来源又是非常广泛的,大多数来自不同的对象,而且有可能来自不同的db ,所以给首页做缓存是很必要的.那么主页的缓存策 ...
- 怎么在Win7系统清除DNS缓存和刷新DHCP列表
如何清除DNS缓存?开始-运行,如下图所示: 2 在谈出的对话框中输入“cmd”,如下图所示: 3 在出现的DOS命令窗口输入“ipconfig /flushdns”,然后就清除DNS缓存了,在我们遇 ...
- Nginx+Tomcat搭建负载均衡
一. 工具 nginx-1.8.0 apache-tomcat-6.0.33 二. 目标 实现高性能负载均衡的Tomcat集群: 三. 步骤 1.首先下载Nginx,要下载稳定 ...
- 小A老师的学习法
3.13