145 lines
4.8 KiB
Markdown
145 lines
4.8 KiB
Markdown
|
|
# 阿里云CloudAuth响应解析修复说明
|
|||
|
|
|
|||
|
|
## 问题描述
|
|||
|
|
|
|||
|
|
在之前的实现中,系统使用了简化的成功判断逻辑,只要API调用成功就返回认证通过,导致即使提交错误的身份信息也会被判断为认证成功。
|
|||
|
|
|
|||
|
|
### 错误的原始实现
|
|||
|
|
```java
|
|||
|
|
// ❌ 错误的简化逻辑
|
|||
|
|
verifyResult = true; // 如果API调用成功且返回了body,则认为验证成功
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 问题表现
|
|||
|
|
- 用户提交错误的姓名和身份证号
|
|||
|
|
- 系统仍然显示"认证成功"
|
|||
|
|
- 日志显示:"注意:当前使用简化的成功判断逻辑,请根据实际API响应调整"
|
|||
|
|
|
|||
|
|
## 解决方案
|
|||
|
|
|
|||
|
|
### 1. 正确的API响应结构理解
|
|||
|
|
|
|||
|
|
阿里云CloudAuth身份证二要素验证API的响应结构:
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"Code": "200", // 接口调用状态,200为成功
|
|||
|
|
"Message": "success", // 接口调用信息
|
|||
|
|
"ResultObject": {
|
|||
|
|
"BizCode": "1", // 业务验证结果
|
|||
|
|
// 其他字段...
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2. BizCode含义
|
|||
|
|
- `"1"`: 校验一致 - 姓名和身份证号匹配 ✅
|
|||
|
|
- `"2"`: 校验不一致 - 姓名和身份证号不匹配 ❌
|
|||
|
|
- `"3"`: 查无记录 - 未找到对应的身份信息 ❌
|
|||
|
|
|
|||
|
|
### 3. 修复后的正确实现
|
|||
|
|
|
|||
|
|
```java
|
|||
|
|
// ✅ 正确的解析逻辑
|
|||
|
|
boolean verifyResult = false;
|
|||
|
|
if (response.getBody() != null) {
|
|||
|
|
try {
|
|||
|
|
// 1. 检查接口调用状态
|
|||
|
|
String code = response.getBody().getCode();
|
|||
|
|
log.info("API响应Code: {}", code);
|
|||
|
|
|
|||
|
|
if ("200".equals(code)) {
|
|||
|
|
// 2. 检查业务验证结果
|
|||
|
|
if (response.getBody().getResultObject() != null) {
|
|||
|
|
String bizCode = response.getBody().getResultObject().getBizCode();
|
|||
|
|
log.info("业务验证结果BizCode: {}", bizCode);
|
|||
|
|
|
|||
|
|
switch (bizCode) {
|
|||
|
|
case "1":
|
|||
|
|
verifyResult = true;
|
|||
|
|
log.info("✅ 身份认证成功 - 姓名和身份证号码匹配");
|
|||
|
|
break;
|
|||
|
|
case "2":
|
|||
|
|
verifyResult = false;
|
|||
|
|
log.warn("❌ 身份认证失败 - 姓名和身份证号码不匹配");
|
|||
|
|
break;
|
|||
|
|
case "3":
|
|||
|
|
verifyResult = false;
|
|||
|
|
log.warn("❌ 身份认证失败 - 查无记录");
|
|||
|
|
break;
|
|||
|
|
default:
|
|||
|
|
verifyResult = false;
|
|||
|
|
log.error("❌ 未知的业务验证结果 BizCode: {}", bizCode);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
} else {
|
|||
|
|
String message = response.getBody().getMessage();
|
|||
|
|
log.error("接口调用失败 - Code: {}, Message: {}", code, message);
|
|||
|
|
verifyResult = false;
|
|||
|
|
}
|
|||
|
|
} catch (Exception e) {
|
|||
|
|
log.error("解析API响应时发生异常", e);
|
|||
|
|
verifyResult = false;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 修复验证
|
|||
|
|
|
|||
|
|
### 修复前的日志(错误情况)
|
|||
|
|
```
|
|||
|
|
阿里云Id2MetaStandardVerify响应成功
|
|||
|
|
响应Body: com.aliyun.sdk.service.cloudauth20190307.models.Id2MetaStandardVerifyResponseBody@7d49dacf
|
|||
|
|
API调用成功,检查验证结果
|
|||
|
|
✅ 阿里云身份认证成功 - 姓名和身份证号码匹配
|
|||
|
|
注意:当前使用简化的成功判断逻辑,请根据实际API响应调整
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 修复后的日志(正确情况)
|
|||
|
|
```
|
|||
|
|
阿里云Id2MetaStandardVerify响应成功
|
|||
|
|
开始解析API响应结果
|
|||
|
|
API响应Code: 200
|
|||
|
|
接口调用成功,检查业务验证结果
|
|||
|
|
业务验证结果BizCode: 2
|
|||
|
|
❌ 阿里云身份认证失败 - 姓名和身份证号码不匹配 (BizCode=2)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 测试场景
|
|||
|
|
|
|||
|
|
### 1. 正确信息测试
|
|||
|
|
- **输入**: 正确的姓名和身份证号
|
|||
|
|
- **期望**: BizCode=1,认证成功
|
|||
|
|
- **日志**: `✅ 阿里云身份认证成功 - 姓名和身份证号码匹配 (BizCode=1)`
|
|||
|
|
|
|||
|
|
### 2. 错误信息测试
|
|||
|
|
- **输入**: 错误的姓名或身份证号
|
|||
|
|
- **期望**: BizCode=2,认证失败
|
|||
|
|
- **日志**: `❌ 阿里云身份认证失败 - 姓名和身份证号码不匹配 (BizCode=2)`
|
|||
|
|
|
|||
|
|
### 3. 无记录测试
|
|||
|
|
- **输入**: 不存在的身份证号
|
|||
|
|
- **期望**: BizCode=3,认证失败
|
|||
|
|
- **日志**: `❌ 阿里云身份认证失败 - 查无记录 (BizCode=3)`
|
|||
|
|
|
|||
|
|
## 安全保障
|
|||
|
|
|
|||
|
|
修复后的实现确保了:
|
|||
|
|
|
|||
|
|
1. **真实验证**: 只有阿里云API返回BizCode=1时才认为认证成功
|
|||
|
|
2. **错误处理**: 妥善处理各种失败情况
|
|||
|
|
3. **异常安全**: 任何解析异常都会导致认证失败
|
|||
|
|
4. **详细日志**: 记录完整的验证过程和结果
|
|||
|
|
|
|||
|
|
## 部署建议
|
|||
|
|
|
|||
|
|
1. **重新测试**: 使用已知的正确和错误身份信息进行测试
|
|||
|
|
2. **监控日志**: 观察新的详细日志输出
|
|||
|
|
3. **验证逻辑**: 确认错误信息不再通过认证
|
|||
|
|
4. **性能监控**: 关注API调用成功率和响应时间
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
*修复完成时间: 2024年9月1日*
|
|||
|
|
*问题状态: ✅ 已解决*
|
|||
|
|
*影响: 🔒 提高了身份认证的准确性和安全性*
|