目录:常见的验证码平台对比
技术细节请见👆
PHP 测试页面:https://www.chenky.com/just4fun/verification-code-test/php/aliyun
Node.js 测试页面:https://www.chenky.com/just4fun/verification-code-test/nodejs/aliyun
首先要注册一个阿里云账号,进入阿里云控制台后通过菜单找到数据风控,开通验证码服务
开通后控制台会给出前后端的 demo,这个 demo 不用记录从别的入口也可以看到。
通过菜单找到数据风控,开通访问控制,这里我们使用 RAM 账号来访问 API 接口。在访问控制–用户管理中新建一个用户:
新建完成后选择 AliyunYundunAFSFullAccess
完成后点击管理,进入管理页面,在管理页面中点击“创建 AccessKey”
保存好生成的 AccessKeyID 和 AccessKeySecret
至此准备工作结束。
PHP:
1、在文档中找到 PHP SDK 后发现其SDK是不支持的composer的,下载后发现SDK内容众多,其中 aliyun-php-sdk-core 中还实现了一种自动加载的方式,恕小弟才疏学浅没能准确描述,将整个 SDK 复制进 PHP 工程的根目录,稍后对其进行整合。
2、回到阿里云控制台的数据风控页面,点击“服务管理”
点击验证码服务的系统集成代码:
找到 PHP 版本的代码示例,参考示例中的逻辑完成 php/app/Helper/AliyunVerificationCode.php 。其中使用 include_once 将 SDK 代码引入。在开发二次验证接口的时候,对于 SDK 返回的结果需要判断 SigAuthenticateResult 中 Code 为 1xx,详见文档 https://help.aliyun.com/document_detail/28332.html?spm=5176.doc28322.6.124.3ZY6OC。这里必须说阿里云 SDK 的文档是及其差劲的,给了 demo 却没说如何判断是否验证成功,判断 1xx 也是查看 API 接口的文档才知道的。这里会用到之前申请的 RAM 的AccessKeyID 和 AccessKeySecret。
3、前端接入倒是不复杂,按照 demo 接入即可,为了方便请求接口我还额外引入了jQuery。同样前端的 SDK 也没有任何文档,从 demo 中只能看出只有一个回调,如果真是这样,那么这个前端 SDK 功能就很少了。
4.阿里云验证码和点触一样,不需要预处理接口,样式上简洁,阿里系的很多网站都在用是他的优势。但是其文档严重缺失,只有理论描述性文档,没有 SDK 接口相关信息,这个接入造成了一些困扰,不过好在有 demo 还算是能顺利接入。
Node.js
1、文档中并未提供 Node.js 的 SDK,但是提供了 API 接口 https://help.aliyun.com/document_detail/28326.html?spm=5176.doc28332.6.118.LrYyfa。API 的地址为 https://cf.aliyuncs.com ,这里一定要用 htttps 请求方式为 GET 采用 UTF-8 编码方式,验证码服务的 Action 参数为 Authenticate 。
请求体包含两部分:公共参数和接口参数。开发过程中,比较懵逼的是 Version 这个字段,该字段描述为“API版本号,为日期形式:YYYY-MM-DD”可是遍历文档都未找到相关说明,在查看 PHP SDK 中 aliyun-php-sdk-cf/CF/Request/V20151127/AuthenticateRequest.php 文件时发现第26行有明显的日期与 Authenticate 字符串,故决定使用 2015-11-27 。
参考文档中的签名机制完成 Signature 字段,这里需要说明的是,按照签名机制中的实例代码最后算出来的签名并不是 SDFQNvyH5rtkc9T5Fwo8DOjw5hc= 而是7pmiH/Ys6tqcJ4v5Uf1g3fMCL5Y= ,忍不住吐槽一下文档作者能不能认真点。这部分逻辑可以参考文件 nodejs/helper/AliyunVerificationCode.js 。而且在计算 hamc 的时候需要返回 buffer 二进制流,不能返回十六进制字符串,在 PHP 即函数 hash_hmac 第四个参数为 true, 在 Node.js 中 hmac.digest() 无需参数。
这里有个小技巧,在签名完成后可以参考文档公共参数中的示例,请求一下接口,如果有问题会给出提示。
在调用接口的时候和 PHP SDK 中 aliyun-php-sdk-cf/CF/Request/V20151127/AuthenticateRequest.php 文件对比了一下,返现字段居然不一致,PHP SDK 中增加了 SceneId 字段,即前端中的 nc_scene 字段,反正最后我是加上了。其中还有一个字段是 Serno ,该字段描述是“参数签名”,遍历文档也没找到参数签名是怎么生成的,WTF?稍微研究了一下 PHP SDK 和 PHP 调用代码后发现应该是用 afsAppkey、afsAk、nc_token 和 sig 拼成字符串后取其 md5 值,其中后两者由前端传来。在和 API 接口的示例对比后发现缺少了 RegionId 字段改字段应该固定填写为 cn-hangzhou 。
2、在以上接口完成后,本以为开发二次验证接口就和 PHP 一样没有什么难度了,可以是在请求的时候居然提示我需要 Token,对比 PHP SDK 后发现, API 文档中的 TokenId 字段应为 Token,这里都无力吐槽这个文档了。在获得结果后同样要对 Code 为 1xx 进行判断,以判断是否验证成功。
3、前端接入和PHP完全一样,没有什么需要修改的。
4、阿里云验证码作为第三方的服务提供 API 接口是很好的,但前提是有完善的文档,像阿里云这样的文档质量让我产生了深深的怀疑,这真的是阿里云的工程师写的?
啊啊啊。。。这两天就更。。。