设置代理服务器

为解决浏览器中请求不同域名下的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请求添加CORSResponse Header(即Access-Control-Allow-OriginAccess-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');

备注

由于客户的技术栈不尽相同,我们无法在这里将所有类型的代理服务器都一一列举。 客户可以根据以上两种代理服务器中的思路,针对自己的服务器类型自主开发。

results matching ""

    No results matching ""