众所周知使用微信云托管一个天然优势是,小程序发起的请求在服务中可以直接从请求头中获取用户 openid。这样一来省去了客户端做 login,服务端换取 openid 的繁琐步骤。相当于云托管自动帮我们做了登录校验,如果拿到用户的 openid 说明用户登录成功了并且也拿到了用户的唯一标识。
但有一个小问题就是,在数据库表设计中用户表有自己的 id,是不是应该使用 openid 完全替代 id 的业务作用进而(几乎)不再需要使用 id?这样做当然是最简单省事的方案,但如果小程序后续开发 web 端或 App 端,openid 作为用户标识必然会传回客户端,这样 openid 作为某种意义上的长期口令就很容易泄漏了,攻击者就可以利用 openid 伪装成小程序发出的请求破坏用户数据。
我的这种担忧是否存在?面对这种未来有扩展非微信平台端可能的应用有什么最佳实践?我想了下,最直接的方式可能是在拿到 openid 后查询用户 id,只把 openid 当作令牌而不作为用户标识,这样就大大降低了 openid 泄漏的风险。不知道大家有没有遇到类似的问题,有什么想法,是怎么解决的?

如果你要开发web应用或者小程序,那就用不了openid作为用户的唯一id,必须在自己的系统中生成一个id来实现。因为对于同一个微信账号,小程序和app应用获取的openid是不同的。