接入阿里无痕验证

简介: 接入阿里无痕验证

前端

<!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 "";
    }
}
相关文章
|
前端开发 JavaScript
uniapp移动端悬浮按钮(吸附边缘)
uniapp移动端悬浮按钮(吸附边缘)
715 0
|
8月前
|
数据采集 人工智能 编解码
AI训练师速成攻略(二):数据收集与清洗
在AI训练中,数据如同未经提炼的矿石,需精心筛选方能化为“黄金”。本文将带你从零开始,探索数据挖掘与处理的艺术:如何定位富饶的“矿脉”,选取合适的工具,规避常见陷阱,并通过实战演练掌握数据清洗技巧。此外,还展望了未来数据工作的趋势,如自动化革命和新兴数据源。让我们手持数字筛子,在混沌中寻找真金,在平凡的数据清洗中铸就非凡的AI智慧。
466 1
|
8月前
|
人工智能 搜索推荐 机器人
grok官网是什么?这次一定要记好了!GROK3官网入口
grok官网是什么?这次一定要记好了!GROK3官网入口
|
Java 调度 Maven
【分布式任务调度平台 XXL-JOB 急速入门】从零开始将 XXL-JOB 接入到自己的项目(下)
【分布式任务调度平台 XXL-JOB 急速入门】从零开始将 XXL-JOB 接入到自己的项目(下)
1654 0
|
11月前
|
SQL DataWorks 搜索推荐
DataWorks产品评测与最佳实践体验报告
DataWorks是阿里巴巴云推出的一款高效数据处理平台,通过内置的数据集成工具和ETL功能,实现了多源数据的自动化处理与分析。本文介绍了DataWorks在用户画像分析中的应用实践,展示了其如何帮助企业高效管理数据资源,支持决策制定及营销优化。同时,文章还评测了DataWorks的产品体验,包括开通流程、功能满足度等方面,并与其它数据开发平台进行了比较,突出了DataWorks在易用性、性能和生态完整性上的优势。最后,对Data Studio新版本中的Notebook环境进行了初步探索,强调了其在提升开发效率方面的价值。
387 16
|
10月前
|
SQL Java 数据库连接
【潜意识Java】深入理解MyBatis,从基础到高级的深度细节应用
本文详细介绍了MyBatis,一个轻量级的Java持久化框架。内容涵盖MyBatis的基本概念、配置与环境搭建、基础操作(如创建实体类、Mapper接口及映射文件)以及CRUD操作的实现。此外,还深入探讨了高级特性,包括动态SQL和缓存机制。通过代码示例,帮助开发者更好地掌握MyBatis的使用技巧,提升数据库操作效率。总结部分强调了MyBatis的优势及其在实际开发中的应用价值。
281 1
|
JavaScript 前端开发 索引
JavaScript中实现页面跳转的七种方法
JavaScript中实现页面跳转的七种方法
1217 0
|
安全 JavaScript
Vue3+Pinia实现Keycloak高效身份验证!
Vue3+Pinia实现Keycloak高效身份验证!
|
前端开发 JavaScript
如何在文本域右下角设置字数限制提示
如何在文本域右下角设置字数限制提示
491 3
|
存储 缓存 Java
Java本地高性能缓存实践问题之使用@CachePut注解来更新缓存中数据的问题如何解决
Java本地高性能缓存实践问题之使用@CachePut注解来更新缓存中数据的问题如何解决
316 0