钉钉微应用的免登录流程

  最近做了个钉钉企业内部微应用的项目。记录下自己的心得。

  首先根据官方文档明白免登流程

  免登录的流程如上。首先我们需要拿到自己企业的corpId,和corpSecret,访问企业后台https://oa.dingtalk.com/index.htm#/microApp/microAppList登录后就可以拿到(当然你得有管理员权限),拿到这两个参数后,通过调用钉钉的接口,我们就可以拿到令牌了,也就是access_Token。根据官方文档的的说明,申请一个access_Token的有效时间是两个小时,同时该接口对每分钟的访问量有限制,所以最好请求到缓存在本地。代码如下。

  

function getToken(){
		if(Session::has('dingToken')){
			$accessToken = Session::get('dingToken');
		}else{
			$corpId = config('ding.CorpId');
			$corpSecret = config('ding.CorpSecret');
			$urlToken = "https://oapi.dingtalk.com/gettoken?corpid=$corpId&corpsecret=$corpSecret";
			$resToken = apiGet($urlToken);
			$resToken = json_decode($resToken,true);
			$accessToken = $resToken['access_token'];
			Session::set('dingToken',$accessToken);
		}
		return $accessToken;
	}

  在登录前,首先要在前端引入钉钉的js文件,以前钉钉的js是要分pc端与移动端的,引入的js也不一样,pc端为前缀为dingTalkPc,移动端前缀为dd。但是钉钉前不久有重新更新了开发文档,将两种js合并在了一起,通过传入type参数区分设备,如下图代码所示。

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

  js的地址我就不写了,开发文档中有。上面的代码在钉钉开发文档中称之为鉴权。在钉钉的api中有部分api必须是要先进行鉴权才能调用的,而有部分则不需要。为什么要说这个呢。因为有两种免登的方式,一种比较简单,一种比较复杂。相信你也猜到了,简单的不需要鉴权,而复杂的需要鉴权。这两种方式也互有利弊。

  我们先来说简单的。当我们拿到access_Token后就可以进行免登了。在页面中引入钉钉的js文件后,调用js中的api,如下

dd.ready(function() {
    dd.runtime.permission.requestAuthCode({
        corpId: "corpid",
        onSuccess: function(result) {
        {
            code: 'hYLK98jkf0m' //string authCode
        }
        },
        onFail : function(err) {}
  
    });
});

  这个api是不用鉴权的,需要你把corpId传到前台来,当页面加载完成后自动执行,执行成功后会返回code码,值得一提的是钉钉做了限制,它的jsapi只能在钉钉应用中访问,所以如果直接在浏览器中查看时没有效果的,所以如果你要在电脑上调试,就需要下载一个RC版的钉钉,打开钉钉后,在浏览器中输入http://localhost:16888/就可以在浏览器中看到控制台了,手机上的话同样也有开发版的钉钉app,在app设置中打开调试模式,开启手机usb调试权限,通过下图中google浏览器的工具来捕捉输出。

  回归正题,通过钉钉的jsapi拿到code,code也是有过期时间的,为5分钟有效时间。拿到code后将code传回后台加上access_Token访问钉钉的免登api,验证成功后返回用户信息,其中就有用户的唯一标识Id,再使用拿到de用户Id加上access_Token访问另外一个api,代码如下。

public function getUserInfo(){
        //code
        $data = input();
        $code = $data['code'];

        //Access_Token
        $accessToken = getToken();

        //userId
        $urlId = "https://oapi.dingtalk.com/user/getuserinfo?access_token=$accessToken&code=$code";
        $resId = apiGet($urlId);
        $resId = json_decode($resId,true);
        $userId = $resId['userid'];

        //登录用户信息
        $urlInfo = "https://oapi.dingtalk.com/user/get?access_token=$accessToken&userid=$userId";
        $resInfo = apiGet($urlInfo);
        $resInfo = json_decode($resInfo);
        $resInfo = get_object_vars($resInfo); 
}

  就此,免登录完成了。当然这种方法也有缺陷,那就是返回的用户信息比较少,不是那么全面。只能拿到如下参数

  如果需要更多的用户信息,那我们就需要进行比较复杂的免登方式了。也就是说我们在请求用户信息前必须进行一次鉴权,才能拿到更多的用户信息。回到拿到access_Token的开头,我们从后端开始,从一开始的流程图来看,鉴权需求ticket,nonceStr,timeStamp,signature,agentId,corpId这六个参数agentId和corpId是直接可以拿到的,不再赘述,ticket带上accessToken参数通过接口获得,noceStr用于生成密钥的参数,我是直接给的随机数。timeStamp当前时间戳,而

signature则是上述几个参数通过一定算法得到。

function ddconfig(){
    //Access_Token
    $accessToken = getToken();
    // $accessToken = "08bbf680be4f3a028aa652e75a0ad754";

    //ticket
    $urlTicket = "https://oapi.dingtalk.com/get_jsapi_ticket?access_token=$accessToken";
    $resTicket = apiGet($urlTicket,false);
    $resTicket = json_decode($resTicket,true);
    $ticket = $resTicket['ticket'];

    //signature
    $nonceStr = md5(rand(10000000,99999999));
    $agentId = 181397144;
    $timeStamp = time();
    $url = get_current_url();

    $plain = 'jsapi_ticket=' . $ticket .
        '&noncestr=' . $nonceStr .
        '&timestamp=' . $timeStamp .
        '&url=' . $url;
    $signature = sha1($plain);

    $corpId = config('ding.CorpId');

    $data['nonceStr'] = $nonceStr;
    $data['agentId'] = $agentId;
    $data['timeStamp'] = $timeStamp;
    $data['url'] = $url;
    $data['signature'] = $signature;
    $data['corpId'] = $corpId;

    return $data;
}

  拿到这几个参数后将其返回到前端页面。首先进行钉钉鉴权,代码前面已经贴过,值得注意的是鉴权过程中需要初始化jsapi,只有初始化了的jsapi在后面才能被调用,鉴权后的过程就跟第一种方法一样,拿着返回的code码,请求userId和用户信息。最终可以拿到用户的完整信息。再通过与自己数据库的数据作对比就完成了免登。

转载于:https://www.cnblogs.com/zhouyuanpei/p/9397198.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
钉钉是阿里巴巴集团专为企业打造的一个专业通讯、协同办公平台,钉钉4.0全新界面,带来全新体验,应用全面升级,搭配全新智能办公硬件,让数千万企业提前进入到云和移动办公时代。功能介绍  企业沟通功能  视频电话会议  1.高清稳定的画面  2.随时随地高效沟通  3.支持3到5人同时加入  商务电话  1.一键发起商务电话,让团队内部沟通变得简单便捷,简易高效的电话会议体验,支持2~9人同时加入。  2.商务电话费,降低沟通成本。  3.新颖的电话面板控制方式,实时显示参会者在线状态和通话质量;  4.快速发起会议,实时增加、删除成员,控制静音,面板皆可实现。  5.高清电话会议语音,底层采用业界顶尖语音编解码引擎和运营商级语音线路。  DING功能  1.钉钉发出的DING消息将会以费电话OR费短信OR应用内消息的方式通知到对方。  2.无论接收手机有无安装钉钉APP,是否开启网络流量,均可收到DING消息,实现无障碍的信息必达。  3.当接受人收到DING消息提醒电话时,号码显示为发送方的电话号码,接收方接听电话听到发送方的语音信息后,如果是文字信息,系统会将文字播报给收听方,接收方即可直接进行语音回复,发送方便可及时收到回复。  消息已读未读  1.无论是一对一聊天,还是一对多的群消息,钉钉让用户都能知道发出的消息对方是否阅读,哪些人已阅,哪些人未读。  2.用户发送信息后,消息旁显示“n人未读”,尤其是在群里发布信息(钉钉支持1500人大群),点击“n人未读”可查看未读人和已读人的详细列表,并能够对未读人发送DING消息。  团队组建功能  钉钉推出了所有用户新建团队OR企业功能,任意一个企业、组织或者个人,无论你是企业内的部门、企业内的兴趣团体、企业内的虚拟项目组等待,甚至是社团、班级及其他社会组织···你都可以快速创建你的团队,并且享受大量费权益。  澡堂模式  1.澡堂模式是基于消息分层理念的升级,在普通聊天窗点击聊页面点击右上角的墨镜图标开启澡堂对话。  2.在此模式下,信息不能被复制,用户不用担心被录音,姓名、头像都会被打马赛克。  3.聊天内容在已读后30秒内消失,不留痕迹。如同在澡堂一般,只能“看在眼里、烂在心里”,保证重要信息沟通隐私安全。  4.针对安全诉求更高的用户,钉钉可以在设置中开启隐藏澡堂对话功能,让信息真正安全!  企业通讯录  1.上传企业内部全体成员、同事的职务title、负责业务、联系方式等到钉钉后用户即可不存号码,就能找到同事、团队成员。  2.钉钉通讯录还与个人通讯录打通,可同时添加公司同事和个人通讯录朋友,方便发起各种聊天、群、多人电话。  企业群  1.钉钉可以成立企业群,  企业群员是经过员工表格确定的,保障安全。  2.“认证用户”才能进入到“企业群”中,该群只包含企业内通讯人,一旦出现人事变动,离职员工会即时从整个通讯录和所有群组中退出。  3.企业群支持群公告发布,发布后支持实时查看已读未读[29] nbsp;。  企业(团队)办公协同功能  C-SmartWork  1.多种方式考勤,支持无网络信号打卡。  2.日志智能报表,实时掌握团队业务数据。  3.审批支持自定义,自建模版表单,满足个性需求。  C-OA【钉OA】  1.与通讯结合的企业办公,高效快速完成审批,通知,日志等办公必备应用。  2.结合钉钉的基础通信能力,将各种办公审批快速短信,电话通知对方,消息必达。  审批功能  钉钉中审批有着自己独到的功能,融合通讯移动办公,随时随地申请秒批,零等待和更强大的执行力。  公告功能  1.C-OA提供了DING公告的概念,员工是否阅读过公  告内容清晰可见。  2.公告内容只有企业群内部人员才可以看到,独有的“水印”功能保障信息安全。  3.和线下公告不同的是,除了文本内容以外,线上公告还可以提供附件功能,文件可添加。  日志功能  1.钉钉日志支持,不同的企业,日志有不同的统一格式,方便员工填写。  2.日志支持,横屏手机即可自动汇总报表。  管理日历  1.钉钉推出了管理模式,管理者“方寸之间,尽在掌握”。  2.进入管理日历之后,企业人员的签到、请假外出、日报提交等状态,将会一览无遗。  签到功能  外勤签到,管理者可快速查看团队外出员工分布,掌握员工外勤工作情况。  企业主页  1.钉钉认证企业可以在PC端管理后台设置自己的主页,企业可上传自己企业的LOGO,简介,业务,电话,网址等信息;  2.支持把企业对外的联系人显示出来,非本企业员工可以通过企业主页联系到企业相应人员。  C-mail【钉邮】  与即时通讯高度融合的商务办公邮箱,把Email进化为C-Mail,已读未读一目了然,沟通进度可追踪可推动,重要邮件不再错过。  邮件发送方  1

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值