阿里云的服务 数据风控下面有项滑动验证, 适合有人机验证场景的应用接入.

所谓滑动验证, 是在需要进行人机识别时, 前端出现验证滑块, 通过拖动滑块到末尾, 实现验证. 如果阿里云认为此次验证风险稍高, 可能出现点击汉字的认证等, 如果风险太高, 验证会直接拒绝.

集成过程基本是按照 阿里云官方文档 来进行的.

开通滑动验证服务之后, 阿里云控制台会给出前后端的示例代码, 其中appkey是根据用户不同分配的不通的key.

前端代码如下所示:

示例-WEB版

用户名:

密码:

var nc = new noCaptcha();

var nc_appkey = '你的appkey'; // 应用标识,不可更改

var nc_scene = 'other'; //场景,不可更改

var nc_token = [nc_appkey, (new Date()).getTime(), Math.random()].join(':');

var nc_option = {

renderTo: '#dom_id',//渲染到该DOM ID指定的Div位置

appkey: nc_appkey,

scene: nc_scene,

token: nc_token,

trans: '{"name1":"code0"}',//测试用,特殊nc_appkey时才生效,正式上线时请务必要删除;code0:通过;code100:点击验证码;code200:图形验证码;code300:恶意请求拦截处理

callback: function (data) {// 校验成功回调

console.log(data.csessionid);

console.log(data.sig);

console.log(nc_token);

document.getElementById('csessionid').value = data.csessionid;

document.getElementById('sig').value = data.sig;

document.getElementById('token').value = nc_token;

document.getElementById('scene').value = nc_scene;

}

};

nc.init(nc_option);

body {

background: #f5f5f5;

font-size: 14px;

line-height: 20px;

margin: 0;

padding: 0;

}

.container {

background: #fff;

padding: 20px;

margin: 20px;

width: 400px;

}

.ln {

padding: 5px 0;

}

.ln .h {

display: inline-block;

width: 4em;

}

.ln input {

border: solid 1px #999;

padding: 5px 8px;

}

其中标记不可更改的地方就不要更改. 可以看到, 在验证通过之后, console会打印出session, sig, token等几个验证返回变量, 连同scene一起, 通过表单返回业务后台, 由后台调用阿里云滑动验证服务进行校验.

python后台方面, 首先需要

pip install aliyun-python-sdk-jaq

安装阿里云滑动验证的python sdk

python的后台代码大致如下:

# coding: utf-8

import requests

from aliyunsdkcore import client

from aliyunsdkjaq.request.v20161123 import AfsCheckRequest

from aliyunsdkcore.profile import region_provider

from app.libs.configure import config

region_provider.modify_point('Jaq', 'cn-hangzhou', 'jaq.aliyuncs.com')

clt = client.AcsClient(config.ALIYUN_OSS_ACCESS_KEY, config.ALIYUN_OSS_ACCESS_SECRET, 'cn-hangzhou')

def check_aliyun_captcha(session, sig, token, scene):

request = AfsCheckRequest.AfsCheckRequest()

# 必填参数:请求来源: 1:Android端; 2:iOS端; 3:PC端及其他

request.set_Platform(3)

request.set_Session(session)

request.set_Sig(sig)

request.set_Token(token)

request.set_Scene(scene)

result = clt.do_action_with_exception(request)

print result

这只是个简单示例, print出了返回结果. 这个返回结果是json序列化的string, 需要将其反序列化进行结果判定. 如果Data元素是true的话, 证明校验通过, 可以进行下面的业务逻辑.

同样的, 这里还有一点没有处理, 就是do_action_with_exception的抛出ServerException的问题. 应当catch处理.

如果验证通过的话, 阿里云返回:

{"Data":true,"ErrorMsg":"success.","ErrorCode":0}

但只能验证一次, 第二次同样参数执行的话, 会返回:

{"Data":false,"ErrorMsg":"invalid sig parameter.","ErrorCode":400}

是为了防止暴力尝试等.

同时必须说明, 阿里云的这项服务我认为并不稳定, 集成中间出现了一直invalid sig的报错. 后来经与技术支持沟通才ok. 并且这块的文档友好程度等还比较欠缺.

另: 我还按照阿里云api文档(滑动验证api, 公共参数, 签名机制)的说明写了段代码, 不使用aliyun-python-sdk, 手动拼接请求.同样发现了很多问题.

比如文档中有一段

这个签名值应当不是随便写的. 使用文档中要求的HMAC-SHA1签名算法, 无论是用python像如下这样书写:

from hashlib import sha1

import hmac

from base64 import b64encode

hashed = hmac.new('testsecret&', string_to_sign, sha1)

signature = b64encode(hashed.digest())

print signature

还是像如下用Java算签名:

import javax.crypto.Mac;

import javax.crypto.SecretKey;

import javax.crypto.spec.SecretKeySpec;

import org.apache.commons.codec.binary.Base64;

public class HMACSHA1 {

private static final String MAC_NAME = "HmacSHA1";

private static final String ENCODING = "UTF-8";

public static byte[] HmacSHA1Encrypt(String encryptText, String encryptKey) throws Exception {

byte[] data=encryptKey.getBytes(ENCODING);

SecretKey secretKey = new SecretKeySpec(data, MAC_NAME);

Mac mac = Mac.getInstance(MAC_NAME);

mac.init(secretKey);

byte[] text = encryptText.getBytes(ENCODING);

return mac.doFinal(text);

}

public static void main(String[] args) throws Exception{

byte[] bytes = HMACSHA1.HmacSHA1Encrypt("string_to_sign", "testsecret&");

System.out.println(Base64.encodeBase64String(bytes));

}

}

string_to_sign用文档中给出的替换, 我的两段程序算出的是一致的, 但都跟文档中给出的不一致. 不清楚为何基础算法会不一致, 难道是文档不够新.

如果我用python如下根据api文档实现自己的后台请求方法的话:

import random

from urllib import quote

from hashlib import sha1

import hmac

import requests

from base64 import b64encode

import datetime

def utcnow_isostr():

dt = datetime.datetime.utcnow()

return datetime.datetime.strftime(dt, '%Y-%m-%dT%H:%M:%SZ')

def quote_ali(element):

return quote(str(element)).replace('+', '20%').replace('*', '2A%').replace('%7E', '~')

def build_afs_check_request(session, sig, token, scene):

m = dict()

m['Action'] = 'AfsCheck'

m['Format'] = 'JSON'

m['Version'] = '2016-11-23'

m['AccessKeyId'] = config.ALIYUN_OSS_ACCESS_KEY

m['SignatureMethod'] = 'HMAC-SHA1'

m['Timestamp'] = utcnow_isostr()

m['SignatureVersion'] = '1.0'

m['SignatureNonce'] = str(int(random.random()*1000000))

m['token'] = token

m['sig'] = sig

m['session'] = session

m['scene'] = scene

m['platform'] = 3

ks = m.keys()

ks.sort()

query_list = list()

for k in ks:

query_list.append(k + '=' + quote_ali(m[k]))

string_to_sign = 'GET&%2F&' + '&'.join(query_list)

print string_to_sign

base_query_string = '&'.join(query_list)

hashed = hmac.new(config.ALIYUN_OSS_ACCESS_SECRET + '&', string_to_sign, sha1)

signature = b64encode(hashed.digest())

print signature

url = 'http://jaq.aliyuncs.com/?{}&Signature={}'.format(base_query_string, quote_ali(signature))

print url

return url

def custom_check_aliyun_captcha(session, sig, token, scene):

url = build_afs_check_request(session, sig, token, scene)

resp = requests.get(url)

print resp.content

这么去请求的话会报Signature不一致, 果不出所料.

基于以上诡异的表现, 我觉得阿里云滑动验证作为外部服务并不友好或成熟. 更倾向于用自己做的一些验证码服务, 虽然会简单些, 更容易被攻破, 至少稳定, 提供的qps更高.

阿里python认证_集成阿里云滑动验证(python)相关推荐

  1. vue项目中引入阿里云滑动验证

    注册阿里云账号 参照滑动验证demo 滑动验证在vue中使用步骤 1.在vue-cli安装的项目中,index.html页面引入js <html><head><meta ...

  2. 阿里acp认证是什么 阿里acp认证含金量高吗

    很多人互联网的从业人员有时候都不是清楚阿里acp认证是什么,阿里acp认证含金量高吗?做为一个企业推出的资格认证,阿里acp认证的含金量是很高的.由于阿里云在国内市场的领先地位,他们推出的认证资格在市 ...

  3. 记录:阿里云滑动验证

    导入依赖 <dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-co ...

  4. 请给出计算231-1的python表达式_计算 2 31 -1 的 Python 表达式是 。_学小易找答案

    [填空题]国内教学目标分类的二维层次模型中,教学内容被分为哪五个层次:事实.概念.技能.______.问题解决. [多选题]报表子系统提供的图表格式一般包括? [填空题]激发和维持学生学习动机的模型- ...

  5. vscode怎么安装python库_如何在vscode中安装python库的方法步骤

    免费资源网 - https://freexyz.cn/ vscode安装python库 1.已经在vscode中装了python并配置好python运行环境. 检查是否正确配置好运行环境,按Windo ...

  6. flask执行python脚本_如何在Flask中运行python脚本

    我有一个Flask脚本,可以创建网站并动态打印一些数据.-打印的数据应来自另一个python脚本. 我目前面临的问题是,如果我将执行python脚本的行放在执行Flask应用程序的行之前,它将运行Py ...

  7. 苹果系统安装python环境_如何在mac下配置python虚拟环境

    安装python虚拟环境核心目的就是为了复制一个python环境,这样新项目下载的所有包,都会存放在虚拟环境下的python site-package 中 首先安装 1. sudo pip insta ...

  8. ai python 面试_面试分享系列 | 17道Python面试题,让你在求职中无往不利

    今天给大家分享的是Python面试题系列的第一篇文章,后续我也会陆续整理Python相关的问题给大家,无论是求职者还是新人都可以通过面试题来考察自己的能力缺陷. 1.Python中pass语句的作用是 ...

  9. 量化投资与python语言_在量化投资领域,为什么Python如此受欢迎?

    说起Web领域 你立马会想到JavaScript语言,它在Web领域不可撼动:Python也已经在金融量化投资领域占据了重要位置,从各个业务链条都能找到相应的框架实现. 在量化投资(证券和比特币)开源 ...

最新文章

  1. Java集合框架的知识总结(1)
  2. sample,batch和epoch都是啥意思??
  3. 小M的简单题(easy)
  4. Java的基础方法Java的对象_java基础之 创建对象的几种方式
  5. php获取网页js中的json,从php获取json数据使用js读取显示到网页笔记
  6. python中如何追加_如何在Python中将元素添加到列表中-追加,扩展和插入
  7. 正则表达式只能写数字_正则表达式真的很骚,可惜你不会写
  8. 解析MySQL基础架构及一条SQL语句的执行流程和流转
  9. 计算机网络中的HTML,计算机网络分类有哪些
  10. Gantt - attachEvent事件监听 - 无参数事件
  11. ResNet+ FPN网络结构
  12. 支付宝小程序前端开发简介
  13. Windows server2016 计算机管理中找不到用户和组
  14. html实现弹窗输入
  15. 计算机无法自动更新,电脑时间不能自动更新怎么办?
  16. Andoird conflicts with another tag that has the same ID
  17. 2019-CCPC-秦皇岛站-I题-Problem I. Invoker(DP)
  18. EtherCAT总线控制伺服力矩控制功能块TorqueControl_FB(汇川H5U PLC)
  19. BP神经网络隐含层节点数的确定
  20. 商业银行个人客户价值指标体系

热门文章

  1. MegaCli 安装及使用
  2. win10将搜索栏缩小
  3. Altium Designer 22安装步骤
  4. git代码规范检测工具
  5. 移动电源解锁亚马逊要做62133和60950测试报告你知道吗?
  6. C语言实现音乐播放器 visual studio 2019
  7. 【深入Java虚拟机】之七:Javac编译与JIT编译
  8. 学校学生学籍的计算机管理属于什么领域,浅谈计算机管理学生学籍信息系统的重要性...
  9. nginx配置之温故而知新
  10. 实验二 数据类型、运算符与表达式→ 张玉生《C语言程序设计实训教程》双色版 配套实验书答案 (纯手打, 仅供参考)