天天看点

接入阿里无痕验证

前端

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="utf-8" />
    <script th:src="@{/public/js/jquery.min.js}"></script>
    <script th:src="@{https://g.alicdn.com/AWSC/AWSC/awsc.js}"></script>
</head>
<body>
<form id="login-form">
    <input id="account" type="text" placeholder="账号" />
    <input id="password" type="password" placeholder="密码">
    <button type="button" id="register" >注册</button>
</form>
<div id="nc"></div>
<script th:inline="javascript">
    var appKey = [[${appKey}]];
    var scene = [[${scene}]];

    // 实例化nvc 对无痕验证进行初始化操作
    AWSC.use("nvc", function (state, module) {
        // 初始化 调用module.init进行初始化
        window.nvc = module.init({
            // 应用类型标识。它和使用场景标识(scene字段)一起决定了无痕验证的业务场景与后端对应使用的策略模型。您可以在阿里云验证码控制台的配置管理页签找到对应的appkey字段值,请务必正确填写。
            appkey: appKey,
            //使用场景标识。它和应用类型标识(appkey字段)一起决定了无痕验证的业务场景与后端对应使用的策略模型。您可以在阿里云验证码控制台的配置管理页签找到对应的scene值,请务必正确填写。
            scene: scene,
            // 二次验证获取人机信息串,跟随业务请求一起上传至业务服务器,由业务服务器进行验签。
            success: function (data) {
               window.console && console.log(data)
                verificationData(data, 'nc');
            },
            // 前端二次验证失败时触发该回调参数
            fail: function (failCode) {
               window.console && console.log("fail:"+failCode)
             },
             // 前端二次验证加载异常时触发该回调参数。
             error: function (errorCode) {
               window.console && console.log("error:"+errorCode)
             }
        });
    });

    
    // 发送业务请求:点击按钮时触发,主动获取人机信息串,并发送给业务服务端
    $('#register').click(function () {
        window.nvc.getNVCValAsync(function (nvcVal) {
            // 获取人机信息串
            // 将以下getNVCVal()函数的值,跟随业务请求一起上传,由后端请求AnalyzeNvc接口并返回200,400,600或者800。
            verificationData(nvcVal, 'nvc');
        });
    })

    function verificationData(data, type) {
        $.ajax({
            url: "/ali/nvcAnalyze",
            type: "POST",
            data: {"data": data, 'type': type},
            success: function (data) {
                business_handle(data);
            }
        })
    }

    // 处理业务返回结果:人机信息串上传接口的回调函数,通过业务服务端的返回结果,控制无痕验证的不同状态。
    function business_handle(data) {
        console.log(JSON.stringify(data));
        // 业务服务器请求回调控制是否需要二次验证
        if (data.code == '100' || data.code == '200') {
            // 无痕验证通过
            alert("验证通过!");
            // 去注册或登录
        } else if (data.code == '800' || data.code == '900') {
            // 无痕验证失败,直接拦截
            alert("验证失败!");
            // 跳转到账号密码页
            var ncoption = {
                // 声明滑动验证需要渲染的目标ID。
                renderTo: "nc",
                // 二次验证文案配置
                upLang: {
                    'cn': {
                        //加载状态提示。
                        'LOADING': "加载中...",
                        //等待滑动状态提示。
                        'SLIDE': "请向右滑动验证",
                        //验证通过状态提示。
                        'SUCCESS': "验证通过",
                        //验证失败触发拦截状态提示。
                        'ERROR': "非常抱歉,网络出错了...",
                        //验证失败触发拦截状态提示。
                        'FAIL': "验证失败,请重试"
                    }
                }
            }
            // 唤醒二次验证(滑动验证码)
            window.nvc.getNC(ncoption);
        } else if (data.code == '400') {
            // 无痕验证失败,触发二次验证
            // 二次验证码(滑动验证码)配置项设置,详情请见滑动验证集成方式文档
            // 二次验证的appkey,scene,test值及success,fail,error的回调由nvc初始化时决定,请不要在二次验证时传入
            var ncoption = {
               // 声明滑动验证需要渲染的目标ID。
               renderTo: "nc",
               // 二次验证文案配置
               upLang: {
                   'cn': {
                     //加载状态提示。
                     'LOADING': "加载中...",
                      //等待滑动状态提示。
                      'SLIDE': "请向右滑动验证",
                      //验证通过状态提示。
                      'SUCCESS': "验证通过",
                      //验证失败触发拦截状态提示。
                      'ERROR': "非常抱歉,网络出错了...",
                      //验证失败触发拦截状态提示。
                      'FAIL': "验证失败,请重试"
                    }
               }
            }
            // 唤醒二次验证(滑动验证码)
            window.nvc.getNC(ncoption);
        }
    }
</script>
</body>
</html>           

后端接口:

@Controller
@RequestMapping("/ali")
public class AliWuHenYzmController {
    public static final String REGIONID = "cn-hangzhou";
    public static final String ACCESS_KEY_ID = "*** Provide your AccessKeyId ***";
    public static final String ACCESS_KEY_SECTET = "*** Provide your AccessKeySecret ***";
    public static final String PRODUCT = "afs";
    public static final String ENDPOINT = "afs.aliyuncs.com";
    public static final IClientProfile PROFILE = DefaultProfile.getProfile(REGIONID, ACCESS_KEY_ID, ACCESS_KEY_SECTET);
    
    static {
        DefaultProfile.addEndpoint(REGIONID, PRODUCT, ENDPOINT);
    }

    @RequestMapping("/index")
    public String index(ModelMap map) {
        String appKey = "FFFF0N0000000000A01A";
        map.put("appKey", appKey);
        String scene = "nvc_register_h5";
        map.put("scene", scene);
        return "wuhen/slid_test";
    }

    @RequestMapping("/nvcAnalyze")
    @ResponseBody
    public Object nvcAnalyze(String data, String type) {
        Map<String, Object> hashMap = new HashMap<>();
        String code = verificationData(data);
        if (code == null || "".equals(code.trim())) {
            code = "400";
        }
        hashMap.put("code", code);
        return hashMap;
    }

    public String verificationData(String nvcVal) {
        AnalyzeNvcRequest request = new AnalyzeNvcRequest();
        //必填参数,由前端获取getNVCVal方法获得的值。
        request.setData(nvcVal);
        // 通过setScoreJsonStr方法声明"服务端调用阿里云验证码接口得到的返回结果"与"前端执行操作"间的映射关系,并通知验证码服务端进行二次验证授权。
        // 注意:前端页面必须严格按照该映射关系执行相应操作,否则将导致调用异常。
        // 例如,在setScoreJsonStr方法中声明"400":"NC",则当服务端返回400时,您的前端必须唤醒滑动验证(NC),如果唤醒其他验证,则将导致失败。
        //根据业务需求设置各返回结果对应的客户端处置方式。
        request.setScoreJsonStr("{\"200\":\"PASS\",\"400\":\"NC\",\"800\":\"BLOCK\"}");
        try {
            IAcsClient client = new DefaultAcsClient(PROFILE);
            AnalyzeNvcResponse response = client.getAcsResponse(request);
            return response.getBizCode();
            // TODO
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "";
    }
}