接入阿里无痕验证

简介: 接入阿里无痕验证

前端

<!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 "";
    }
}
相关文章
|
6月前
|
数据采集 人工智能 编解码
AI训练师速成攻略(二):数据收集与清洗
在AI训练中,数据如同未经提炼的矿石,需精心筛选方能化为“黄金”。本文将带你从零开始,探索数据挖掘与处理的艺术:如何定位富饶的“矿脉”,选取合适的工具,规避常见陷阱,并通过实战演练掌握数据清洗技巧。此外,还展望了未来数据工作的趋势,如自动化革命和新兴数据源。让我们手持数字筛子,在混沌中寻找真金,在平凡的数据清洗中铸就非凡的AI智慧。
349 1
|
小程序 开发工具 Android开发
uni-app使用HBuilder X编辑器本地打包apk步骤说明
uni-app使用HBuilder X编辑器本地打包apk步骤说明
2113 0
|
存储
在 Web 中判断页面是不是刷新
【9月更文挑战第10天】在Web开发中,判断页面是否刷新有多种方法:1) 监听`popstate`事件,检测用户是否通过历史记录访问页面;2) 记录并比较页面加载时间戳,若相差极小,则可能为刷新;3) 利用本地存储设置特定值,若该值不存在或不符合预期,则页面可能被刷新。然而,这些方法并非绝对准确。
504 3
|
8月前
|
SQL Java 数据库连接
【潜意识Java】深入理解MyBatis,从基础到高级的深度细节应用
本文详细介绍了MyBatis,一个轻量级的Java持久化框架。内容涵盖MyBatis的基本概念、配置与环境搭建、基础操作(如创建实体类、Mapper接口及映射文件)以及CRUD操作的实现。此外,还深入探讨了高级特性,包括动态SQL和缓存机制。通过代码示例,帮助开发者更好地掌握MyBatis的使用技巧,提升数据库操作效率。总结部分强调了MyBatis的优势及其在实际开发中的应用价值。
190 1
|
Python 开发工具
第三方支付黑马-CodePay 码支付使用(二)
自古以来有关钱的事情都会特别复杂, 无论是人还是物! 在很多项目中我们都会用到支付功能, 市面上目前存在的银联支付, 支付宝支付, 微 信支付等等第三方支付都会遇到比较复杂的流程, 不是合格的商家公司是没法使用的! 而码支付CodePay打破了这个常规, 虽然作为第三方支付平台, 但是这个平台只提供支付结果订单的结算, 并不对接现金流! 采用的是个人/商家自己的收款码现金是直接到账的形式!
第三方支付黑马-CodePay 码支付使用(二)
|
JavaScript 前端开发 索引
JavaScript中实现页面跳转的七种方法
JavaScript中实现页面跳转的七种方法
1075 0
|
Web App开发 iOS开发
三种获取苹果设备UID的方式
三种获取苹果设备UID的方式
3391 0
|
机器学习/深度学习 人工智能 计算机视觉
CVPR 2023 | AdaAD: 通过自适应对抗蒸馏提高轻量级模型的鲁棒性
CVPR 2023 | AdaAD: 通过自适应对抗蒸馏提高轻量级模型的鲁棒性
427 0
|
Android开发
Hbuilder打包android安装包流程
Hbuilder打包android安装包流程
|
开发工具 git
Git派生的项目提交合并请求之后代码被覆盖
Git派生的项目提交合并请求之后代码被覆盖
463 0