调用阿里云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帐号时未传入人脸图片 直接抛出异常即可

业务逻辑:

  1. 根据username将用户信息从数据库中查出 并将faceId取出
    直接调用service就可以了 没有什么好说的
        AdminUser adminUser = adminService.findUsernameByAdmin(faceLoginBO.getUsername());
        String faceId = adminUser.getFaceId();

        if (StringUtils.isBlank(faceId)) {
            GraceException.display(ResponseStatusEnum.ADMIN_FACE_NULL_ERROR);
        }
  1. 使用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
点击调试 输入该输入的 则 自动生成业务代码
image

传入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);
posted @   RainbowMagic  阅读(502)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示