返回博客列表
后端工程2026年8月20日2 分钟阅读
微信小程序登录与用户数据隔离的 Go 实现
从 wx.login 到 code2Session,再到 JWT 与 Repository 条件,完整说明小程序身份如何转成可信的数据边界。
#Go#Gin#MySQL#JWT#微信小程序

小程序登录经常被简化成“拿 openid 建用户”,但真正需要保证的是:临时 code 不能复用、session_key 不泄漏、客户端不能指定 user_id,并且每一条业务查询都带上当前身份。
登录流程
小程序调用 wx.login 获取短期 code
后端携带 AppID 与 Secret 调用 code2Session
根据 openid 查找或创建本地用户
签发只包含必要身份字段的 JWT
后续请求由鉴权中间件注入 userId
不要把 session_key 发回前端
session_key 用于微信数据解密,应留在可信服务端。日志也不应打印 code、session_key、Secret、完整 openid 或 Authorization 头。
数据隔离落在 Repository
db.Where("user_id = ? AND id = ?", currentUserID, productID).First(&product)只在 Handler 校验一次并不够。详情、更新、删除、统计以及子资源写入,都需要把当前用户条件带入数据访问层。添加使用记录前还要先验证 product_id 的归属。
错误边界
code 无效:返回明确的微信登录错误,不暴露上游敏感响应
用户被禁用:拒绝签发或使用 Token
JWT 过期:统一返回未认证,不尝试猜测用户
资源不属于当前用户:返回不存在或无权限,避免泄漏对象信息
本地开发
本地环境可以替换微信接口为受控测试实现,但不能在生产代码中保留万能 openid。配置由环境变量注入,启动时检查默认 Secret,测试覆盖不同用户访问同一资源 ID 的场景。