fix: 二维码接口去鉴权(修复破图)+ 产品序列号加部门前缀
1) 二维码破图
/products/qrcode/{sn} 带了 Depends(get_current_user),而前端是用
<img src="/api/v1/products/qrcode/{sn}"> 引用它的 —— <img> 无法携带
Authorization 头,请求必然 401,页面上就是破图(同时刷大量 401 审计)。
该接口不查库、只把调用方传进来的字符串渲染成二维码,没有数据泄露面,
故去掉鉴权。刻意不做 ?token= 兜底:JWT 进 URL 会渗进访问日志、浏览器
历史与 Referer,比它想解决的问题更糟。
实测:HTTP 200 / image/png / 300x300。
2) 序列号部门前缀
新增 config.SERIAL_PREFIX(LICA 为 "L"),counter_service 生成
{前缀}{15 位 HEX},总长仍严格 16 位 —— products.serial_number 是
String(16),前端 TaskTreeViewer / ManualInput / ScanPage 多处按 16 位
校验,不能改总长。IRIS 实例该值为空串,格式保持原样。
实测 LICA 生成 L000000000000002。
前端本就兼容带字母的序列号:TaskTreeViewer 的占位符示例就是
X20260801000001,ScanPage 的 replace(/[^a-zA-Z0-9]/g,"") 也不会滤掉 L。
This commit is contained in:
@ -26,13 +26,22 @@ router = APIRouter(prefix="/products", tags=["产品管理"])
|
||||
# ============================================================
|
||||
|
||||
@router.get("/qrcode/{serial_number}")
|
||||
async def get_product_qrcode(
|
||||
serial_number: str,
|
||||
current_user: dict = Depends(get_current_user),
|
||||
):
|
||||
async def get_product_qrcode(serial_number: str):
|
||||
"""
|
||||
生成产品二维码(PNG 图片)。
|
||||
内容为 16 位序列号,扫描后可调用 /scan/{serial_number} 查询产品。
|
||||
|
||||
⚠️ 本接口【刻意不加鉴权】:
|
||||
前端以 `<img src="/api/v1/products/qrcode/{sn}">` 引用它,而 <img>
|
||||
无法携带 Authorization 头 —— 加了鉴权会让所有二维码图片加载失败
|
||||
(页面上显示成破图),并在审计里刷出大量 401。
|
||||
|
||||
不加鉴权是安全的:本函数**不查数据库**,只校验长度并把这个字符串渲染成
|
||||
二维码,没有任何业务数据泄露面(序列号本身就是调用方提供的)。
|
||||
|
||||
也刻意不支持 ?token= 兜底:把 JWT 放进 URL 会渗进访问日志、浏览器历史
|
||||
与 Referer,比它想解决的问题更糟。
|
||||
|
||||
内容为序列号,扫描后可调用 /scan/{serial_number} 查询产品。
|
||||
尺寸:300×300 px,用于 PC 端打印或嵌入标签。
|
||||
"""
|
||||
if len(serial_number) != 16:
|
||||
|
||||
Reference in New Issue
Block a user