前言

有时候我们做了一些网页,希望只有某些人才能看的话,可以搞一个钉钉扫码登录,接入也比较简单,下面记录下接入的过程。

流程

我们先看看官方的文档:钉钉接入文档
梳理一下官方的流程:
1、先跳去一个扫码网页,配置好参数就能跳,然后用用户去扫码;
2、扫码成功后,会自动跳转回你之前设置的页面,并在链接上带一个code的参数;
3、利用appkey和秘钥去获取token,这个token有效期为2小时;
4、利用第2步获取的code和第3步获取的token,去请求接口,得到一个持久码;
5、利用第4步获取的持久码再去请求接口,得到一个SNS_TOKEN;
6、利用第5步获取的SNS_TOKEN再去请求接口,得到userInfo的信息,然后解析就能拿到用户昵称。
流程很简单,就是按着文档说的,一步一步往下调接口就行。

坑点

如果是在网页直接调接口的话,会存在跨域的问题。所以得搞一个接口做转发。
我写了个PHP

<?php
// 指定允许其他域名访问
header('Access-Control-Allow-Origin:*');
// 响应类型
header('Access-Control-Allow-Methods:POST');
// 响应头设置
header('Access-Control-Allow-Headers:x-requested-with,content-type'); $type=$_GET['type'];
if($type==""){
echo "请输入type";
}else if($type==1){
echo curl_get_https("https://oapi.dingtalk.com/sns/gettoken?appid={{APP_ID}}&appsecret={{KEY}}");
}else if($type==2){
if($_GET['code']==""||$_GET['token']==""){
echo "请输入code和token";
}else{
$data = array ('tmp_auth_code' => $_GET['code']);
$data_string = json_encode($data);
echo curl_post_https("https://oapi.dingtalk.com/sns/get_persistent_code?access_token=".$_GET['token'],$data_string);
}
}else if($type==3){
if($_GET['code']==""||$_GET['token']==""||$_GET['openid']==""){
echo "请输入code、token、openid";
}else{
$data = array ('openid' => $_GET['openid'],'persistent_code' => $_GET['code']);
$data_string = json_encode($data);
echo curl_post_https("https://oapi.dingtalk.com/sns/get_sns_token?access_token=".$_GET['token'],$data_string);
}
}else if($type==4){
if($_GET['token']==""){
echo "请输token";
}else{
echo curl_get_https("https://oapi.dingtalk.com/sns/getuserinfo?sns_token=".$_GET['token']);
}
}else{
echo "没有获取内容";
} function curl_post_https($url,$data_string){ // 模拟提交数据函数
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
curl_setopt($ch, CURLOPT_HTTPHEADER, array ('Content-Type: application/json;charset=utf-8'));
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// 线下环境不用开启curl证书验证, 未调通情况可尝试添加该代码
curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0);
$res = curl_exec($ch);
curl_close($ch);
return $res; // 返回数据,json格式
} function curl_get_https($url){
$curl = curl_init(); // 启动一个CURL会话
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_HEADER, 0);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); // 跳过证书检查
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, true); // 从证书中检查SSL加密算法是否存在
$tmpInfo = curl_exec($curl); //返回api的json对象
//关闭URL请求
curl_close($curl);
return $tmpInfo; //返回json对象
}
?>

OK,通过上面的接口转发后,前端就可以按照上面的接口去调了,很简单。

其他

如果按照正常的逻辑呢,是要求2小时token过期,然后要重新扫码登录的。但我们的需求不用那么严格,只要他扫码过,登录成功,验证了用户身份,就保存下状态,下次再进入该网页的时候,就不用再扫码了。流程图如下:

 

OK,大概就这样。

最新文章

  1. 查看eclipse web项目中jsp编译后的servlet源文件【转】【JSP】
  2. 烤鸭的Source Insight学习笔记
  3. [解决方案] pythonchallenge level 5
  4. Linux xargs将输出数据流转换成命令参数
  5. docker学习整理
  6. 在 Eclipse 中使用 JSHint 检查 JavaScript 代码
  7. Win32中GDI+应用(二)--初始化与清理
  8. test在博客中嵌入实例代码
  9. 申请Jetbrain教育帐号,免费使用一年
  10. Python关于类的实操
  11. jQuery实现动态分割div—通过拖动分隔栏实现上下、左右动态改变左右、上下两个相邻div的大小
  12. Java 中 LinkedList 和 ArrayList 的区别
  13. Oracle PLSQL 客户端 连接Oracle12.2 出现权限问题的解决办法以及绿色版Oracle客户端的使用.
  14. MySQL表类型和存储引擎
  15. java 性能优化 字符串过滤实战
  16. springmvc 开涛 数据验证
  17. grep常用用法
  18. VS收集插件
  19. ORB-SLAM(五)KeyFrame类-最小生成树
  20. 利用Python将文件进行分类整理

热门文章

  1. centos7 更改ip
  2. 阶段5 3.微服务项目【学成在线】_day04 页面静态化_12-页面静态化-页面静态化流程
  3. 使用VLC发送TS流与播放TS流
  4. ehcache快速入门
  5. WordPress的默认循环
  6. 神经网络手写数字识别numpy实现
  7. 13 Ways Companies Do Whatsapp Marketing &amp; Support (May 2019)
  8. 关于Angular+ngx-perfect-scrollbar自定义各大浏览器滚动条样式的解决方法
  9. Qt中QGraphics类坐标映射关系详解
  10. 《C和指针》读书笔记