api key验证需查数据库或缓存确认有效性,签名验证须用hmac-sha256按固定格式构造原文(含method、path、timestamp、nonce、排序后query、body),并校验时效性、防重放及严格一致性。

API Key验证:别只校验存在,要查数据库或缓存
光检查请求头里有没有 X-API-Key 不够,攻击者能伪造任意字符串。必须查它是否真实存在于你的系统中,且状态有效(未过期、未禁用)。
常见错误现象:401 Unauthorized 返回太快,但实际没查数据库;或者把 key 明文硬编码在代码里。
- 从
request.headers.get('X-API-Key')取值,注意大小写和空格 - 用 Redis 或数据库查 key 对应的
api_key_id和secret(别存明文 secret) - 验证 key 的
is_active和expires_at字段 - 避免在每次请求都走全量 DB 查询,加一层 Redis 缓存(key → user_id + permissions)
签名验证:用 HMAC-SHA256,别手写拼接逻辑
签名不是“把参数连起来 MD5 一下”,而是固定顺序、标准化编码、带时间戳和随机 nonce 的完整流程。漏掉任何一环,防重放和防篡改就失效。
使用场景:POST /v1/orders 这类修改数据的接口必须签名;GET 查询类可选,但敏感操作建议强制。
图片提示词生成器?不止如此。 马甲系统 —— 把脑海中的画面,翻译成AI能理解的专业表达。 用得越多,它越懂你:首次需要多问几句确认方向,用久了几乎一说就懂。 用得越多,它越快:缓存机制让后续对话越来越省。 RAG进化:成功案例持续入库,越跑越聪明。 输入「新手指南」查看完整功能介绍
- 客户端必须传
X-Signature、X-Timestamp(秒级 UNIX 时间)、X-Nonce(一次性随机字符串) - 服务端先校验
X-Timestamp是否在 ±300 秒内,超时直接拒 - 用 redis 记录已用过的
X-Nonce(带 TTL),防止重放 - 签名原文格式为:
f"{method}\n{path}\n{timestamp}\n{nonce}\n{sorted_query_string}\n{body_json_or_empty}"(注意换行符和空 body) - 用查出的
secret做hmac.new(secret.encode(), msg.encode(), 'sha256').hexdigest(),比对X-Signature
Flask 路由装饰器怎么统一加验签逻辑
每个接口都写一遍验证逻辑容易漏,也难维护。用装饰器最直接,但要注意它不能拦截 404 或静态路由,且异常要转成标准响应。
性能影响:签名验证本身很快(微秒级),瓶颈在 Redis/DB 查询和 body 解析。别在装饰器里重复读 request.get_data()。
- 装饰器里用
request.get_data(cache=True)确保 body 只读一次 - 对
application/json请求,解析后缓存到g.parsed_json,后续视图函数直接用 - 捕获
SignatureVerificationError、ApiKeyNotFoundError等自定义异常,在@app.errorhandler统一返回401或403 - 跳过 OPTIONS 预检请求(
if request.method == 'OPTIONS': return make_response('', 200))
测试签名时最容易错的三件事
本地调试通过,上线就 401,八成是这三处之一。签名验证对空格、换行、编码极其敏感,差一个字符就失败。
错误现象:X-Signature 在 Postman 里手动计算能过,用 Python requests 就失败;或 GET 正常、POST 报错。
- body 是空字典
{}时,JSON 序列化后是"{}",不是空字符串;用json.dumps(data, separators=(',', ':'))去空格 - query string 必须按 key 字典序排序并 urlencode,中文要
quote(..., safe=''),别用url_encode默认行为 - Flask 的
request.path不含 query,但request.url_rule.rule含变量名(如/v1/users/<id></id>),要用request.base_url拼接原始路径
\n,多一个空格,就验不过。大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










