返回博客列表
后端工程2026年8月20日2 分钟阅读

微信小程序登录与用户数据隔离的 Go 实现

从 wx.login 到 code2Session,再到 JWT 与 Repository 条件,完整说明小程序身份如何转成可信的数据边界。

#Go#Gin#MySQL#JWT#微信小程序

小程序登录经常被简化成“拿 openid 建用户”,但真正需要保证的是:临时 code 不能复用、session_key 不泄漏、客户端不能指定 user_id,并且每一条业务查询都带上当前身份。

登录流程

  1. 小程序调用 wx.login 获取短期 code

  2. 后端携带 AppID 与 Secret 调用 code2Session

  3. 根据 openid 查找或创建本地用户

  4. 签发只包含必要身份字段的 JWT

  5. 后续请求由鉴权中间件注入 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 的场景。