图形认证服务通过理清人机请求边界并以图形交互抵御机器异常请求,可用于帮助企业在注册、抢购、查询等业务运营过程中识别并防御各种机器虚拟流量。本文将介绍如何通过在服务端调用接口使用图形认证功能。
Demo下载
请根据您所需语言下载对应Demo,根据README.md文件指引,运行Demo并启动项目。
接入流程
在图形认证方案管理控制台新增认证方案,获取密钥参数(包括
appId
、appKey
)。服务端配置
appId
、appKey
参数。用户在客户端界面通过图形验证码后,客户端将生成验证参数。
服务端业务接口获取用户业务请求及验证参数,生成签名后,上传到二次校验接口,确认用户本次验证的有效性。
示例代码
服务端集成示例代码如下:
def post(self):
# 1.初始化验证密钥参数信息
# 请填写在控制台创建认证方案后生成的appId和appKey
captcha_id = "<YOUR_APP_ID>" # 请填写appId
captcha_key = "<YOUR_APP_KEY>" # 请填写appKey
api_server = "https://captcha.alicaptcha.com"
# 2.获取用户验证后,前端传过来的验证参数
lot_number = self.get_argument("lot_number", "")
captcha_output = self.get_argument("captcha_output", "")
pass_token = self.get_argument("pass_token", "")
gen_time = self.get_argument("gen_time", "")
# 3.生成签名
# 生成签名使⽤标准的hmac算法,使用用户当前完成验证的流水号lot_number作为原始消息message
# 采用sha256散列算法将message和key进行单向散列生成最终的签名
lotnumber_bytes = lot_number.encode()
prikey_bytes = captcha_key.encode()
sign_token = hmac.new(prikey_bytes, lotnumber_bytes, digestmod="SHA256").hexdigest()
# 4.上传校验参数到验证服务⼆次验证接口, 校验用户验证状态
query = {
"lot_number": lot_number,
"captcha_output": captcha_output,
"pass_token": pass_token,
"gen_time": gen_time,
"sign_token": sign_token,
}
# captcha_id参数建议放在url后面, 方便请求异常时可以在日志中根据id快速定位到异常请
url = api_server + "/validate" + "?captcha_id={}".format(captcha_id)
# 注意处理接口异常情况,当请求⼆次验证接口异常或响应状态非200时做出相应异常处理
# 保证不会因为接口请求超时或服务未响应而阻碍业务流程
try:
res = requests.post(url, query)
assert res.status_code == 200
msg = json.loads(res.text)
except Exception as e:
msg = {"result": "success", "reason": "request api fail"}
# 5.根据⼆次验证接口返回的用户验证状态, 完成您自己的业务逻辑
if msg["result"] == "success":
self.write({"login": "success", "reason": msg["reason"]})
else:
self.write({"login": "fail", "reason": msg["reason"]})
二次校验接口
接口信息 | 说明 |
接口地址 | https://captcha.alicaptcha.com/validate |
协议⽀持 | HTTP/HTTPS |
请求方法 | GET/POST |
请求格式 | application/x-www-form-urlencoded |
返回类型 | JSON |
请求参数
请求参数 | 类型 | 说明 |
lot_number | String | 验证流水号。 |
captcha_output | String | 验证输出信息。 |
pass_token | String | 验证通过标识。 |
gen_time | String | 验证通过时间戳。 |
captcha_id | String | 验证ID。 |
sign_token | String | 验证签名。 |
返回示例
校验成功返回示例
{
"status": "success", // 请求状态
"result": "success", // ⼆次校验结果
"reason": "", // 校验结果说明
"captcha_args": { // 验证输出参数
"used_type": "icon",
"user_ip": "127.0.0.1",
"lot_number": "4dc3cfc2cdff448cad8d13107198d473",
"scene": "反爬虫",
"referer": "http://127.0.0.1:8077/"
// ...
}
}
校验失败返回示例
{
"status": "success", // 请求状态
"result": "fail", // ⼆次校验结果
"reason": "pass_token expire", // 校验结果说明
"captcha_args": { // 验证输出参数
"used_type": "icon",
"user_ip": "127.0.0.1",
"lot_number": "4dc3cfc2cdff448cad8d13107198d473",
"scene": "反爬虫",
"referer": "http://127.0.0.1:8077/"
// ...
}
}
请求结果异常返回示例
{
"status": "error", // 请求状态
"code": "-50005", // 错误码
"msg": "illegal gen_time", // 错误信息
"desc": { // 错误描述
"type": "defined error"
}
}
文档内容是否对您有帮助?