视频平台图片鉴权接口开发踩坑记录
在水文监测后台管理系统中,视频设备接口需要返回缩略图鉴权信息,看似简单的需求却踩了几个坑:双重鉴权体系混淆、API 响应类型转换失败、缓存时间设计不当……本文记录完整的开发过程与问题解决。
问题背景
项目需要为 api/station/material/videoDevices 接口增加 thumbnailAuth 字段,用于返回访问缩略图图片所需的鉴权信息。
根据广东省水利视频共享接口文档:
- 图片鉴权接口:
/lisa/access/sign(POST) - 鉴权有效期:10 分钟
- 返回字段:
x-apig-nonce、x-apig-timestamp、x-apig-appid、x-apig-sign、x-datax-code
看起来是个简单的需求,但实际开发中踩了不少坑。
双重鉴权体系
视频平台包含两套并行的鉴权逻辑,这是理解整个问题的关键:
| 鉴权类型 | 用途 | 接口 | 有效期 |
|---|---|---|---|
| Token 鉴权 | 调用视频列表、播放、云台控制等接口 | /resourceSharing/oauth/token |
25 分钟 |
| Sign 鉴权 | 访问缩略图、告警图片等资源 | /lisa/access/sign |
10 分钟 |
关键点:Sign 鉴权接口本身也需要 Token 鉴权才能调用!这个细节在文档中没有明确说明,导致后续踩坑。
踩坑过程
坑一:请求缺少 Token
现象:
1 | {"data":"请求缺少token","desc":"无权限","status":401} |
原因:最初误认为图片鉴权接口不需要 Token,专门写了一个 sendPostWithoutToken() 方法来调用。
解决:Sign 鉴权接口本身也需要 Token,改用 sendPost() 方法,先获取 Token 再请求:
1 | // 错误写法 |
坑二:ClassCastException 类型转换失败
现象:
1 | java.lang.ClassCastException: java.lang.String cannot be cast to java.util.Map |
原因:API 返回的 data 字段在不同情况下类型不同:
- 正常时是 Map(包含鉴权信息)
- 错误时是 String(错误信息)
解决:添加 instanceof 类型检查:
1 | if (dataObj instanceof Map) { |
坑三:thumbnailAuth 始终为 null
现象:接口返回正常,但 thumbnailAuth 字段始终为 null。
原因:原逻辑存在设计缺陷——只有当 thumbnail 不为空时才去获取鉴权信息。但有些设备没有缩略图,却仍然需要鉴权信息来访问告警图片。
解决:将获取鉴权信息移到循环外部,预先获取一次,统一设置给所有设备:
1 | // 1.5 预先获取图片鉴权信息(对所有设备通用,只需获取一次) |
坑四:账户权限不足
现象:
1 | {"data":"","desc":"共享用户无权限访问该接口","status":401} |
原因:这不是代码问题,是视频平台账户权限问题。当前的共享用户账户没有 /lisa/access/sign 接口的访问权限。
解决:需要联系视频平台提供方开通接口权限。
核心代码实现
获取图片鉴权信息(带缓存)
1 | /** |
缓存时间设计
当存在多层缓存时,内层缓存的过期时间应小于外层缓存:
| 缓存层 | 有效期 | 说明 |
|---|---|---|
| 图片鉴权缓存 | 9 分钟 | 留 1 分钟缓冲 |
| 接口整体缓存 | 9 分钟 | 原来是 10 分钟,已调整 |
如果不这样设计,可能会出现:外层缓存还活着,但内层的鉴权信息已经过期,导致返回无效的鉴权参数。
经验总结
1. 第三方接口鉴权要确认清楚
文档可能不完整或有误,实际联调前应该:
- 确认接口是否需要鉴权
- 确认鉴权方式(Token、Sign、API Key 等)
- 确认账户是否有对应权限
2. 外部 API 响应要做类型检查
外部 API 的响应结构可能因为各种原因(错误、权限、参数)发生变化,使用 instanceof 进行类型检查可以避免运行时异常。
3. 缓存时间要层层递减
多层缓存场景下,内层缓存有效期必须小于外层,避免返回过期数据。
4. 日志是调试的好帮手
在排查问题时,添加原始响应日志非常关键:
1 | log.info("图片鉴权API原始响应: {}", response); |
这帮助快速定位是代码问题还是平台权限问题。
当前状态
| 项目 | 状态 |
|---|---|
| 代码实现 | ✅ 完成 |
| 单元测试 | ✅ 完成 |
| 缓存逻辑 | ✅ 完成 |
| 平台权限 | ❌ 待开通 |
下一步:联系视频平台方开通 /lisa/access/sign 接口权限,然后验证完整链路。