天天看點

接入阿裡無痕驗證

前端

<!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 "";
    }
}