微信小程序无法脱离于微信运行,所以严格意义上来说,它其实没有真正意义上的授权状态。
背景
小程序有两个方法用于实现用户的授权,分别是 wx.login 用于授权登录获取用户唯一识别 openid ; wx.checkSession 用于识别登录状态。
从系统设计角度看,这是一个非常合理的设计思路,因为小程序自身并不能完全控制用户的登录状态,受限于较多外部因素:用户的设备,设备的内容,微信是否重启,手机内存回收导致的微信缓存数据的丢失等等,都有可能让小程序自身实现的登录控制失效。
困扰
根据官方文档描述
通过 wx.login 接口获得的用户登录态拥有一定的时效性。用户越久未使用小程序,用户登录态越有可能过期。
反之如果用户一直在使用小程序,则用户登录态一直保持有效。具体时效逻辑由微信维护,对开发者透明。
除了过期失效外,触发获取临时登录凭证 code 的操作(小程序登录 和 数据预拉取)可能会生成新的登录> 态session_key,从而使旧的 session_key 被顶替而失效。
登录态是针对微信->授权给小程序的一种状态设计,它提供的是用户授权状态,它并不能真正提供给小程序一个用户登录态。
checkSession 并不能给小程序提供类似于 session/cookie 的能力和数据,导致小程序必须自己设计一些缓存逻辑用来判断用户是“真实”的登录还是已经失去登录信息。
也就是说即便合理的应用 checkSession ,也无法保证小程序能够知晓 “当前用户是谁”。
结语
这并不是一个新问题,小程序目前生态肯定也已经有很多优秀成熟的方案。本文主要是讨论一下系统设计中看似合理但是无用的一些设计。
END.