zoukankan      html  css  js  c++  java
  • 网页接入dingding扫码登录

    前言

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

    流程

    我们先看看官方的文档:钉钉接入文档
    梳理一下官方的流程:
    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,大概就这样。

  • 相关阅读:
    codeforces 169 div2 C
    poj 1062(最短路)
    sgu 118
    sgu 101
    poj 2446二分图匹配
    ural 1129 (求数据)
    C#中抽象类和接口的区别(转)
    在.net(C# or vb.net)中,Appplication.Exit 还是 Form.Close有什么不同?
    一道爱出的题目,就是前面两个数相加 用递归方法实现
    C#冒泡排序
  • 原文地址:https://www.cnblogs.com/thinkingthigh/p/11603991.html
Copyright © 2011-2022 走看看