员工考勤打卡时,如何避免非本人代替打卡?
本文分享自华为云社区《员工考勤打卡时,如何避免非本人代替打卡?》,作者: HuaweiCloudDeveloper 。
1、背景
使用 APP 进行打卡时,为避免非本人及非真人现场打卡的情况出现,想结合华为云的人脸识别能力,通过调用 API,达成可检测是否本人且真人现场打卡的效果。
2、云服务介绍
华为云 FRS:人脸识别服务(Face Recognition Service),能够在图像中快速检测人脸、分析人脸关键点信息、获取人脸属性、实现人脸的精确比对和检索。该服务可应用于身份验证、电子考勤、客流分析等场景。
华为云 FunctionGraph:函数工作流(FunctionGraph)是一项基于事件驱动的函数托管计算服务。通过函数工作流,只需编写业务函数代码并设置运行的条件,无需配置和管理服务器等基础设施,函数以弹性、免运维、高可靠的方式运行。
华为云 APIG:API 网关(API Gateway)是为企业开发者及合作伙伴提供的高性能、高可用、高安全的 API 托管服务, 帮助企业轻松构建、管理和部署不同规模的 API。简单、快速、低成本、低风险的实现内部系统集成、成熟业务能力开放及业务能力变现。
华为云 OBS: 对象存储服务(Object Storage Service,OBS)是一个基于对象的海量存储服务,为客户提供海量、安全、高可靠、低成本的数据存储能力,使用时无需考虑容量限制,并且提供多种存储类型供选择,满足客户各类业务场景诉求。
华为云 DNS:云解析服务(Domain Name Service)提供高可用,高扩展的权威 DNS 服务和 DNS 管理服务,把人们常用的域名或应用资源转换成用于计算机连接的 IP 地址,从而将最终用户路由到相应的应用资源上。此服务默认开通,免费使用。
3 、方案设计
3.1 方案简述
通过 APIG 调用 functiongraph 函数,在 functiongraph 上完成人脸识别-活体检测、人脸识别-人脸比对等 API 的调用,并将响应结果通过 API 返回给 APP。实现 APP 调用一次 API 即可完成人脸识别的功能。
人脸识别服务的人脸比对功能,可实现检测是否其本人打卡。
人脸识别服务的活体检测功能,可实现检测是否活人打卡。
使用 Functiongraph 的函数,APP 端只需考虑调用一个 API,且只需考虑人脸识别的总体输入和返回结果。
Functiongraph 由 APIG 来调用,利用 APPkey、APPsecret 及 HTTPS,解决了 APP 端调用的安全认证等问题。
OBS 桶用来存储人脸照片,通过约定的用户标识做文件存储路径,易于管理和使用。
3.2 方案架构图

0、初始化:前置准备工作,新建一个 OBS 桶做人脸库,将员工的人脸照片存放到人脸库,并把以 user-id 或自定义字段作为路径,标识员工。
1、员工登录 APP 后,进行人脸识别时,将通过 APIG 来调用 functionGraph,上传关键信息:摄像头捕获的照片或视频、员工的人脸库标识(user-id)。
2、functionGraph 调用活体检测 API,传入照片/视频(根据需求选择动作活体检测/静默活体检测,推荐静默活体检测)。
注:本方案采用静默活体检测方式,APP 端上传的照片提前转换为 base64 格式
3、活体检测 API 返回响应:有 confidence、picture(base64)。
4、在 functionGraph 中调用 OBS 接口,通过 user-id 从 OBS 人脸库获取库中的员工照片。
5、通过代码将从 OBS 获取的照片文件,转换为 base64 格式。
6、将两个 base64 格式的照片作为输入参数调用人脸比对 API 。(备注:此处可根据需求,是否需要多次调用 API,使用多个照片进行验证)
7、人脸比对 API 返回包含了 similarity 的响应。
8、functionGraph 将 similarity、confidence 传回给 APP/后端。(备注:也可直接在 functionGraph 完成判定,返回人脸识别结果)
3.3 Functiongraph 实现代码
代码附件:(附件请见文章最后)
代码时序图:

4、方案部署
4.1 部署流程图

4.2 前置准备
拥有已实名认证的华为云账号,开通云服务 functiongraph、人脸比对、活体检测、OBS
注册公网域名,完成 ICP 备案
4.3、创建 OBS 人脸库
4.3.1 创建 OBS 桶
参考帮助文档:https://support.huaweicloud.com/qs-obs/obs_qs_0007.html,创建私有桶
4.3.2 上传对象
参考帮助文档: https://support.huaweicloud.com/qs-obs/obs_qs_0008.html,上传对象,建立 OBS 人脸库。
要求:文件的路径使用用户标识(如 userid)命名

4.4 Functiongraph 搭建
4.4.1 创建委托
登录 IAM 控制台(https://console.huaweicloud.com/iam/?region=cn-north-4#/iam/agencies)
1)创建委托

委托名称:自定义
委托类型:云服务
云服务:函数工作流 functiongraph
持续时间:永久

2)选择策略
OBS:获取对象等基本操作权限
FRS:fullaccess
APIG:fullaccess

3)设置最小授权范围,此处选择所有,实际可根据项目情况分配。

4)完成委托创建

4.4.2 上传 FRS 依赖包
因 functiongraph 公共的依赖包中,FRS-SDK 不是最新的(无静默活体检测 API),故我们需上传最新的 FRS-SDK,作为依赖包。
1)从官网获取 FRS-SDK 下载路径
https://sdkcenter.developer.huaweicloud.com/?language=python
2)下载整个 Python-v3 的 SDK
https://github.com/huaweicloud/huaweicloud-sdk-python-v3
下载后解压,进入内部,找到 frs 后缀的 SDK
进入 SDK 目录,在 setup 所在的目录,全部选择进行压缩。压缩成功后,需要确保 setup 文件在压缩包的根目录下

将压缩好的文件,上传到 functiongraph 的依赖包管理。

依赖包名称:自定义
运行时语言:2.7
描述:自定义
上传方式:上传 ZIP 文件

4.4.3 创建函数
1)进入 functiongraph 控制台创建函数。
Functiongraph 版本:functiongraph v2
函数类型:事件函数
函数名称:自定义
所属应用:默认
委托名称:选择创建的委托(如无,请点击右边的 创建委托 前往创建,创建步骤参考 4.4.1)
企业项目:自行选择
自定义函数:关闭
运行时语言:Python2.7
函数执行入口:Index.handler
代码上传方式:静默代码


4.4.4 编辑函数代码
将示例代码复制进来,编辑相关默认变量的值
1)粘贴 3.3 节的代码至 index.py 中

2)根据自己项目情况,设置默认 Region、endpoint、buketname 的值,若 4.4.6 节不设置环境变量的值,将默认取此处的默认值。如下默认是北京四

3)编辑完成后,点击保存

4.4.5 添加依赖包
1)在函数菜单-代码页,点击添加-依赖代码包

2)在公共依赖包,搜索 obs,勾选 OBS-sdk

3)在私有依赖包,勾选前面步骤上传的 frs-sdk,然后确定保存

4.4.6 编辑环境变量
在函数菜单-配置页,添加环境变量:region、bucketname(OBS 桶名)、endpoint
若此处不设置环境变量,则函数会使用 4.4.4 节代码设置的默认值。

4.4.7 调试函数
1)点击配置测试事件

2)选择 apig 的事件模板,添加 body 的内容和 queryStringParameters 的 userid,进行保存。

3)点击测试,运行完毕可查看执行结果。

4.5 添加 APIG
4.5.1 添加 APIG 触发器
1)在函数菜单-触发器页,点击创建触发器

触发器类型:API 网关服务(APIG)
API 名称:自定义
分组:选择 API 分组(如无点击右边 创建分组 进行创建)
发布环境:RELEASE(如无点击右边 创建发布环境 进行创建)
安全认证:测试环境可选择 None(后面可编辑进行更改)
请求协议:测试环境可选择 HTTP(后面可编辑进行更改)
后端超时(毫秒):5000

2)创建完成后,在触发器页面会添加一个 APIG 触发器,提供访问 URL

4.5.2 编辑 APIG
1)点击 APIG 触发器名称,前往 APIG 控制台,点击编辑

2)编辑基本信息
此处可更改安全认证,为方便调试,此处保持无认证

3)定义 API 请求
此处需添加 API 的请求参数-用户标识,用于 functiongraph 中,取在 OBS 人脸照片库中的员工照片。

4)定义后端服务
添加后端服务参数,跟前面的入参做一个映射。
因为是在 functiongraph 创建的 APIG,故此处已自动绑定 functiongraph 的函数为后端服务,故基础定义保持默认即可。

5)返回结果基础定义
返回结果的响应示例,暂设置为空即可,点击完成。

4.5.3 调试 API
1)API 详情页,点击调试,跳转到 API 调试页面

2)输入相关请求参数,发起请求,进行调试。

4.5.4 发布 API
编辑完成后的 API,需要进行发布,公网才可访问


4.6 绑定独立域名
子域名仅供开发测试使用,每天最多访问 1000 次。如需开发服务,则需为 API 所在分组绑定独立域名。
4.6.1 添加记录集
1、登录云解析控制台(也可使用其他平台,已完成 ICP 备案的域名),选择域名解析》公网域名,点击需要创建记录集的域名名称。

2、添加记录集

填写以下信息
主机记录:域名前缀,如 face-test
类型:选择 CNAME – 将域名指向另外一个域名
别名:默认即可
线路类型:默认即可
TTL(秒):默认即可
值:填写要指向的别名(此处为 APIG 上的子域名)

添加成功

4.6.2 添加自定义域名
1、在 API 详情页-总览,点击添加增加自定义域名。

2、跳转到 API 所在分组的域名管理控制台,点击绑定独立域名

3、输入前面创建的记录集,点击确定。(如果是刚添加的记录集需刷新,约等 5 分钟)

添加完后,即可在公网通过自定义域名,访问 APIG。

4.7 问题记录
1、并发测试 API 时,发现偶现以下错误
错误 1:人脸比对传入的 base64 字符串无法识别

错误 2:数据传输被提前终止了

问题定位:因函数中的存储到本地的文件用的是同一个路径,并发操作时出现异步的同时占用一个路径,从而导致文件有丢失或文件转码有误
解决方案:给函数中的文件路径配置上时间戳,避免并发操作时,交叉操作同一个文件。
2、APIG 错误码请参考:
https://support.huaweicloud.com/usermanual-apig/apig-ug-180530090.html
3、使用 APIG 触发 functiongraph 时,发现第一个 api 请求响应时间较长(2s 多),后面的请求就较短了(约 500ms)。
问题定位:超过一分钟无调用函数时,函数会销毁。再次进行函数调用时,需要重新启动实例,所以第一次调用时间会比较长。
解决方案:设置预留实例,来消除冷启动效果。预留实例是为指定函数版本单独预留的函数运行实例,不同于普通的函数实例,预留实例长期存活,可以达到消除函数冷启动的效果。
预留实例需要提交工单开通,详情请参考:https://support.huaweicloud.com/usermanual-functiongraph/functiongraph_01_0306.html
5、后期思考
本方案的人脸比对,只比对一次。若人脸库中,用户的库照片有多个,是否需要遍历对比,取总体对比的结果。如对比多次,需要考虑从 OBS 获取照片、人脸比对的 API 要多次调用,性能下降、费用提升等。
附件:index.zip 2.62KB
版权声明: 本文为 InfoQ 作者【华为云开发者社区】的原创文章。
原文链接:【http://xie.infoq.cn/article/ea2316b127ff61908e73798fc】。文章转载请联系作者。
评论