人生代码PHP开发PHP经验分享

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

2020-04-02  本文已影响0人  泥豆芽儿MT
框架: ThinkPHP5.1
系统:Nginx、Win10、CentOS7.2

㈠ 前期准备

㈡ 前端接入代码集成

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

<!-- 国内使用 -->
<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">
    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>",
    });

㈢ 服务端代码集成

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

   /**
     * 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,可参考 :
 * $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;
}
上一篇 下一篇

猜你喜欢

热点阅读