ThinkPHP5 集成阿里云滑動驗證功能實例指導

  • 背景
    最近,項目后臺上線后,有人覺得登錄頁的四位驗證碼有時候看不出來,需要刷新好幾次填對;于是在搜索滑動驗證時注意到了阿里云的這個人機驗證功能;雖然也有好多網友提供實現方法,但是經過自己的操作,覺得自己整理一番,不僅可以幫助新手,也能作為自己以后的經驗備忘,歡迎指摘 ...
  • 了解概念,不然也找不到自己選擇這個功能的理由吧
    滑動驗證(No-Captcha,簡稱NC),是阿里巴巴集團打破傳統驗證碼技術推出的最新人機識別服務。阿里云的滑動驗證采用先進的風險分析引擎來區分來自人類與機器人的訪問行為。用戶通過類似滑動解鎖的方式來通過人機驗證,對用戶來說無需思考即可通過人機識別(圖靈測試)的挑戰。

  • 環境

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

㈠ 前期準備

㈡ 前端接入代碼集成

首先,給出官方文檔介紹【 滑動驗證前端代碼集成文檔-PCWEB版】,然后對比我的實際操作代碼即可

  • Html 核心代碼 (至于樣式的優化,文檔中有,自行融合唄)
<!-- 國內使用 -->
<script type="text/javascript" charset="utf-8" src="http://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閱讀 228,333評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,491評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,263評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,946評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,708評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,186評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,255評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,409評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,939評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,774評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,976評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,518評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,209評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,641評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,872評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,650評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,958評論 2 373

推薦閱讀更多精彩內容