调用阿里云API实现人脸登录
步骤
一. 首先判断前端参数是否传入正确
和之前一样 若参数不合法则将异常抛出
public class FaceLoginBO {
@NotBlank
private String img64;
@NotBlank
private String username;
public String getImg64() {
return img64;
}
public void setImg64(String img64) {
this.img64 = img64;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
if (bindingResult.hasErrors()) {
Map<String, String> bindResultErrors = super.getBindResultErrors(bindingResult);
GraceJSONResult.errorMap(bindResultErrors);
}
二. 根据faceId将Mongdo的图片查找到并转换为Base64 若无法找到图片则表示创建Admin帐号时未传入人脸图片 直接抛出异常即可
业务逻辑:
- 根据username将用户信息从数据库中查出 并将faceId取出
直接调用service就可以了 没有什么好说的
AdminUser adminUser = adminService.findUsernameByAdmin(faceLoginBO.getUsername());
String faceId = adminUser.getFaceId();
if (StringUtils.isBlank(faceId)) {
GraceException.display(ResponseStatusEnum.ADMIN_FACE_NULL_ERROR);
}
- 使用restTemplate远程调用根据faceid取出图片并将图片转换为base64
调用之前的方法获取到file对象 然后直接调用utils将文件转换为base64
public GraceJSONResult getFileBase64ByFaceId(String faceId) {
if (StringUtils.isBlank(faceId)) {
GraceException.display(ResponseStatusEnum.ADMIN_FACE_NULL_ERROR);
}
File faceFile = downloadFaceFile(faceId);
String fileToBase64 = FileUtils.fileToBase64(faceFile);
return GraceJSONResult.ok(fileToBase64);
}
utils逻辑很简单
先将文件转换为自己数组 然后根据字节数组调用java工具类即可
public static String fileToBase64(File file) {//将图片文件转化为字节数组字符串,并对其进行Base64编码处理
InputStream in = null;
byte[] fileData = null;
// 读取文件字节数组
try {
in = new FileInputStream(file);
fileData = new byte[in.available()];
in.read(fileData);
in.close();
} catch (IOException e) {
e.printStackTrace();
}
Base64.Encoder encoder = Base64.getEncoder();
return encoder.encodeToString(fileData);
}
因为要远程调用 所以要使用restTemplate 实例化一个restTemplate bean
@Configuration
public class RestTemplateConfig {
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
直接远程调用即可
String getFileBase64Url = "http://www.imoocnews.com:8004/fs/getFileBase64ByFaceId?faceId=" + faceId;
GraceJSONResult base64Result = restTemplate.getForObject(getFileBase64Url, GraceJSONResult.class);
if (base64Result == null) {
GraceException.display(ResponseStatusEnum.ADMIN_FACE_NULL_ERROR);
}
// faceA 数据库中的图片
String faceBase64A = (String) base64Result.getData();
if (faceBase64A == null) {
GraceException.display(ResponseStatusEnum.ADMIN_FACE_NULL_ERROR);
}
三. 调用阿里云面部识别API 将前端传入的图片base64与数据库中的图片base64传递给面部失败api中 若可信度大于70则登录成功
文档地址: https://help.aliyun.com/document_detail/151891.htm?spm=a2c4g.11186623.0.0.2f9b1e0fbtxNuD#doc-api-facebody-CompareFace
点击调试 输入该输入的 则 自动生成业务代码
传入base64图片 若可信度大于70则返回true 否则返回flase
public boolean verifyFace(String faceA, String faceB, float qualityScoreThreshold) {
DefaultProfile profile = DefaultProfile.getProfile("cn-shanghai", aliyunResources.getAccessKeyId(), aliyunResources.getAccessKeySecret());
/** use STS Token
DefaultProfile profile = DefaultProfile.getProfile(
"<your-region-id>", // The region ID
"<your-access-key-id>", // The AccessKey ID of the RAM account
"<your-access-key-secret>", // The AccessKey Secret of the RAM account
"<your-sts-token>"); // STS Token
**/
IAcsClient client = new DefaultAcsClient(profile);
CompareFaceRequest request = new CompareFaceRequest();
request.setEndpoint("facebody.cn-shanghai.aliyuncs.com");
request.setImageDataA(faceA);
request.setImageDataB(faceB);
request.setQualityScoreThreshold(qualityScoreThreshold);
try {
CompareFaceResponse response = client.getAcsResponse(request);
Float confidence = response.getData().getConfidence();
if (confidence < qualityScoreThreshold) {
return false;
}
System.out.println(new Gson().toJson(response));
return true;
} catch (ServerException e) {
e.printStackTrace();
} catch (ClientException e) {
System.out.println("ErrCode:" + e.getErrCode());
System.out.println("ErrMsg:" + e.getErrMsg());
System.out.println("RequestId:" + e.getRequestId());
}
return false;
}
调用api遇到的问题
执行时出错
ErrCode:SDK.EndpointResolvingError
ErrMsg:No endpoint for product 'facebody'.
Please check the product code, or set an endpoint for your request explicitly.
See https://www.alibabacloud.com/help/zh/doc-detail/92049.htm
解决方法:
去https://developer.aliyun.com/endpoints
找到服务的endpoint并设置
request.setEndpoint("facebody.cn-shanghai.aliyuncs.com");
四.. 若登录成功则设置cookie
登录成功直接设置cookie即可
setAdminLoginCookie(request, response, adminUser);
虽然道路是曲折的,但前途是光明的。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律