首页 / 安全
微信小程序后端接口设计:鉴权、签名与安全
小程序后端直接暴露在互联网上,安全设计不能马虎。我踩过的最大的坑,就是“默认建号”和“分享链接被篡改”。下面把接口安全这条线梳理一遍。
一、登录:用 code 换 openid,再发自己的 token
小程序端拿到的只是临时 code,后端用它在服务端调用微信接口换取 openid,再生成自己的登录态(短期 token)。注意:微信的 session 不能下发给前端,只在服务端保存。
二、接口鉴权中间件
把“校验 token”抽成一个中间件,所有需要登录的接口统一拦一道,业务代码里就不用反复写鉴权逻辑。我还有一个“游客模式”:没登录时只返回只读内容,不建号、不发 token,既保护隐私又不影响体验。
三、分享链接必须防篡改
把“整改单分享给别人看”这类需求做成带令牌的链接时,绝不能把 id 明文放在 URL 里——别人改个数字就能看别人的单子。正确做法是服务端用密钥对参数做签名,并带过期时间:
import hmac, hashlib, time
def make_token(data: dict, secret: str) -> str:
body = "&".join(f"{k}={data[k]}" for k in sorted(data))
return hmac.new(secret.encode(), body.encode(),
hashlib.sha256).hexdigest()
# 读取侧:校验签名 + 判断是否过期,任一不符直接 410
老链接失效、令牌过期、签名不对,三种情况一律拒绝,前端拿到明确错误再去拉登录。
原则:凡是“凭链接就能看到数据”的接口,签名和过期时间是底线。不要相信前端传来的任何身份字段,身份必须从 token 或签名里解出来。
四、内容安全兜底
用户发文本、传图片,按平台规则必须做内容安全检测。我在写入中间件里统一调用微信内容安全接口,检测失败就拦截,避免违规内容上线。可以配置“失败放行”开关,调试时方便,上线后务必打开严格模式。
五、HTTPS 与合法域名白名单
小程序要求所有网络请求走 HTTPS,且域名必须提前在后台配置合法域名(request / upload / download 三类分别配)。这是硬门槛:用 IP 或 http 都不行,备案和证书缺一不可。
安全和合规是绑在一起的。下一篇讲数据库结构变更怎么管理,那是另一个“迟早出事”的重灾区。