ThinkPHP5 集成阿里云滑动验证功能实例指导

  • 背景
    最近,项目后台上线后,有人觉得登录页的四位验证码有时候看不出来,需要刷新好几次填对;于是在搜索滑动验证时注意到了阿里云的这个人机验证功能;虽然也有好多网友提供实现方法,但是经过自己的操作,觉得自己整理一番,不仅可以帮助新手,也能作为自己以后的经验备忘,欢迎指摘 ...
  • 了解概念,不然也找不到自己选择这个功能的理由吧
    滑动验证(No-Captcha,简称NC),是阿里巴巴集团打破传统验证码技术推出的最新人机识别服务。阿里云的滑动验证采用先进的风险分析引擎来区分来自人类与机器人的访问行为。用户通过类似滑动解锁的方式来通过人机验证,对用户来说无需思考即可通过人机识别(图灵测试)的挑战。

  • 环境

框架: ThinkPHP5.1
系统:Nginx、Win10、CentOS7.2

㈠ 前期准备

㈡ 前端接入代码集成

首先,给出官方文档介绍【 滑动验证前端代码集成文档-PCWEB版】,然后对比我的实际操作代码即可

  • Html 核心代码 (至于样式的优化,文档中有,自行融合呗)
<!-- 国内使用 -->
<script type="text/javascript" charset="utf-8" src="//g.alicdn.com/sd/ncpc/nc.js?t=2015052012"></script>
    
<div id="your-dom-id" class="layui-form-item nc-container"></div>
<input type="hidden" class="nc_token" name="nc_token" value="X">
  • js 核心代码:
    var nc_appkey = "Your appkey";//写入自己的 appkey
    var nc_token = [nc_appkey , (new Date()).getTime(), Math.random()].join(':');
    var NC_Opt =
        {
            renderTo: "#your-dom-id",
            appkey: nc_appkey ,
            scene: "nc_login",
            token: nc_token,
            customWidth: 300,
            trans:{"key1":"code0"},
            elementID: ["usernameID"],
            is_Opt: 0,
            language: "cn",
            isEnabled: true,
            timeout: 3000,
            times:5,
            callback: function (data) {
                //window.console && console.log(nc_token);
                //console.log('sss',data);
                //TODO 此处 toUrl 即为后台验证链接,根据自己的业务定义即可
                var toUrl = "{:url('cms/login/ajaxAfsCheck')}";
                $.post(
                    toUrl,
                    data,
                    function (result) {
                        if (result.status == 1) {
                            $(".nc_token").val(nc_token);
                        } else {
                            //失败
                            layer.msg(result.message);
                        }
                    }, "JSON");
            }
        };
    var nc = new noCaptcha(NC_Opt);
    nc.upLang('cn', {
        _startTEXT: "请按住滑块,拖动到最右边",
        _yesTEXT: "验证通过",
        _error300: "哎呀,出错了,点击<a href=\"javascript:__nc.reset()\">刷新</a>再来一次",
        _errorNetwork: "网络不给力,请<a href=\"javascript:__nc.reset()\">点击刷新</a>",
    });

㈢ 服务端代码集成

此时可以根据 【滑动验证服务端代码集成文档】,进行整合处理

  • 在【云盾·人机控制台】下载对应语言的SDK
    以鄙人的 ThinkPHP5.1.2框架环境,服务端 SDK代码放置位置参考:
  • 应用服务器 请求处理类的设计:
    此验证方法即为前端js中回调所触发的请求链接地址
    注意:YOUR ACCESS_KEY、YOUR ACCESS_SECRET请替换成您的阿里云子账号(RAM用户)的 accesskey id和secret ; YOUR APP_KEY 写入自己的 appkey
   /**
     * ajax 测试阿里云滑动验证
     * @param Request $request
     * TODO YOUR ACCESS_KEY、YOUR ACCESS_SECRET请替换成您的阿里云子账号(RAM用户)的 accesskey id和secret
     * YOUR APP_KEY : 写入自己的 appkey
     */
    public function ajaxAfsCheck(Request $request)
    {
        if ($request->isPost()) {
            $postData = $request->post();
            include_once '../extend/aliyun/aliyun-php-sdk-core/Config.php';

            $iClientProfile = \DefaultProfile::getProfile("cn-hangzhou", "YOUR ACCESS_KEY",
                "YOUR ACCESS_SECRET");
            $client = new \DefaultAcsClient($iClientProfile);
            \DefaultProfile::addEndpoint("cn-hangzhou", "cn-hangzhou", "afs", "afs.aliyuncs.com");

            $request = new Afs\AuthenticateSigRequest();
            $ip = get_real_ips(); //自定义的一个获取IP地址的方法
            $request->setSessionId($postData["csessionid"]);// 必填参数,从前端获取,不可更改,android和ios只传这个参数即可
            $request->setToken($postData['token']);// 必填参数,从前端获取,不可更改
            $request->setSig($postData['sig']);// 必填参数,从前端获取,不可更改
            $request->setScene('nc_login');// 必填参数,从前端获取,不可更改
            $request->setAppKey("YOUR APP_KEY");//必填参数,后端填写(写入自己的 appkey)
            $request->setRemoteIp($ip);//必填参数,后端填写

            $response = $client->getAcsResponse($request);//返回code 100表示验签通过,900表示验签失败
            $opTag = ($response->Code === 100) ? 1 : 0;
            $message = ($response->Code === 100)? "验签通过":"验签失败";

            if ($opTag){
                Session::set('NC_TOKEN',$postData['token']);
            }else{
                Session::set('NC_TOKEN','NULL');
            }
        } else {
            $opTag = 0;
            $message = "请求不合法";
        }
        return showMsg($opTag, $message,$response); //就是返回 json_encode()处理后的数据
    }

㈣ 后期处理以及效果

在前面的操作完成后,按照完整的业务处理逻辑,紧接着就是要处理登录按钮的触发事件了

> 鄙人的操作是:
   在登录按钮触发的 ajax 请求验证中;
   判断当前 Session 中的 "NC_TOKEN " 是否和 前端隐藏域传来的 "nc_token" 值相等 ;
   如果相等,说明已成功滑动验证通过,继而判断账号和密码是否能成功登录;
   反之提示刷新再次进行验证 ...
  • 执行效果图:


附录:

  • 频繁查看的链接:【云盾·人机控制台
  • 一方面觉得写得太详细了,有点显得冗杂了,其实看文档仔细点也是没问题的
    提示:多留意一下,我在 "㈠ 前期准备" 中提及的信息,尤为重要!!
  • 补充,后台获取IP 地址的函数:
/**
 * 此方法返回用户的IP地址,同时如果拥有代理IP,将会以逗号追加在后面
 * 如果只取用当前IP,可参考 :
 * $ips = explode(',', $bargainModel->get_real_ips());
 * $ip = $ips[0];
 */
function get_real_ips()
{
    global $ip;
    if (getenv("HTTP_CLIENT_IP")) {
        $ip = getenv("HTTP_CLIENT_IP");
    } else if (getenv("HTTP_X_FORWARDED_FOR")) {
        $ip = getenv("HTTP_X_FORWARDED_FOR");
    } else if (getenv("REMOTE_ADDR")) {
        $ip = getenv("REMOTE_ADDR");
    } else {
        $ip = "NULL";
    }
    return $ip;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容