设置代理服务器
为解决浏览器中请求不同域名下的Linkface公有云接口,需要通过代理服务器进行代理转发。在代理服务器中我们可以加API_ID和API_SECRET包含在请求链接中,从而提高了客户账户的安全性。
由于在实际部署的时候,代理服务器和部署H5的服务器往往不会同域,所以用户可以在代理服务器上开启CORS。
也就是说,设置代理服务器主要是为了提高安全性以及解决前端js sdk跨域问题。
需要代理的接口列表
在H5活体检测 JS SDK中使用了以下几个公有云API接口
/liveness/check_liveness
POST请求,检测是否为活体。具体请参考http://devdoc.cloud.linkface.cn/liveness/check_liveness.html
/liveness/check_silent_liveness
POST请求,检测是否为静默活体。具体请参考http://devdoc.cloud.linkface.cn/liveness/check_silent_liveness.html
/hackness/selfie_hack_detect
POST请求,为活体检测返回的照片进行防HACK检测。具体请参考http://devdoc.cloud.linkface.cn/hackness/hackness_selfie_hack_detect.html
/liveness/liveness_image
GET请求,根据检测返回结果中的image_id
来获取关键帧图片。具体请参考http://devdoc.cloud.linkface.cn/liveness/liveness_image.html
Note: 在使用H5活体检测JS SDK,请客户确保自己的账户有以上几个接口的使用权限。
公有云的错误码对代理服务器配置的影响
状态码 | status 字段 |
说明 |
---|---|---|
400 |
DOWNLOAD_TIMEOUT | 网络地址视频获取超时 |
400 |
DOWNLOAD_ERROR | 网络地址视频获取失败 |
400 |
INVALID_ARGUMENT | 请求参数错误,具体原因见 reason 字段内容 |
400 |
WRONG_LIVENESS_DATA | liveness_data 出错 |
401 |
UNAUTHORIZED | 账号或密钥错误 |
401 |
KEY_EXPIRED | 账号过期,具体情况见 reason 字段内容 |
403 |
RATE_LIMIT_EXCEEDED | 调用频率超出限额 |
403 |
NO_PERMISSION | 无调用权限 |
404 |
NOT_FOUND | 请求路径错误 |
500 |
INTERNAL_ERROR | 服务器内部错误 |
上表显示了公有云接口/liveness/check_liveness
返回的错误码,由于错误码都是形如40x
,可能会影响代理服务器的配置。如Nginx服务器默认不会为状态码是40x
的HTTP请求添加CORS
的Response Header
(即Access-Control-Allow-Origin
和Access-Control-Allow-Methods
等,见nginx官方文档)。如微信小程序会对状态码为40x
的Response执行默认的HTTP请求错误处理。诸如这些,都需要在代理服务器里对相应的错误返回结果进行特殊处理。
Nginx代理服务器
在nginx的配置文件如下设置,其中[API_ID]和[API_SECRET]替换为客户自己的API_ID和API_SECRET。
由于公有云的状态码会对服务器配置产生影响[见上一条],因此需要在add_header
后面加上always
的关键字,这个可以使用ppa:nginx/stable
来解决。(见Github解决方案)
server {
listen 80;
add_header 'Access-Control-Allow-Origin' '*' always;
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS' always;
location = /liveness/check_liveness {
set $args api_id=[API_ID]&api_secret=[API_SECRET];
proxy_pass http://cloudapi.linkface.cn/liveness/check_liveness;
}
location = /hackness/selfie_hack_detect {
set $args api_id=[API_ID]&api_secret=[API_SECRET];
proxy_pass http://cloudapi.linkface.cn/hackness/selfie_hack_detect;
}
location ~ ^/liveness/liveness_image(.*)$ {
proxy_pass http://cloudapi.linkface.cn/liveness/liveness_image$1?api_id=[API_ID]&api_secret=[API_SECRET];
}
}
NodeJS代理服务器
步骤一: 使用npm安装http-proxy包。
步骤二: 客户用自己的API_ID和API_SECRET以及指定的端口替换到代码指定位置。
步骤三: 将server.js
部署至服务器,并运行node server.js
。
server.js
const http = require('http')
const URL = require('url')
const httpProxy = require('http-proxy');
const proxy = httpProxy.createProxyServer({})
const allowPostPath=[
'/liveness/check_liveness',
'/liveness/check_silent_liveness',
'/hackness/selfie_hack_detect'
]
const REMOTE_SERVER = 'http://cloudapi.linkface.cn'
const API_ID = ''
const API_SECRET = ''
proxy.on('proxyReq', function(proxyReq, req, res) {
const uri = URL.parse(proxyReq.path)
const path = `${uri.pathname}?api_id=${API_ID}&api_secret=${API_SECRET}`
if (proxyReq.method === 'GET' || (proxyReq.method === 'POST' && allowPostPath.indexOf(uri.pathname) !== -1)) {
proxyReq.path = path
}
})
var server = http.createServer(function(req,res){console.log('XXHH');
res.setHeader('Access-Control-Allow-Origin', '*')
res.setHeader('Access-Control-Request-Method', '*')
res.setHeader('Access-Control-Allow-Methods', 'OPTIONS, GET, POST')
res.setHeader('Access-Control-Allow-Headers', '*')
proxy.web(req, res, { target: REMOTE_SERVER })
}).listen([port], '0.0.0.0');
备注
由于客户的技术栈不尽相同,我们无法在这里将所有类型的代理服务器都一一列举。 客户可以根据以上两种代理服务器中的思路,针对自己的服务器类型自主开发。