(已解决)大家怎么保存登录态的?实测 setStorageSync 似乎不可靠
发布于 6 年前 作者 ming96 17494 次浏览 来自 问答

提了问题一天后,问题解决了:

不是 setStorageSync 的问题。

是我们自己后端的问题。

原因是我们用 union_id 进行用户的查找

Ruby on Rails 代码如下(片段):

User.where(wechat_unionid: unionid)

在用户没有关注公众号的情况下,unionid 是拿不到的,出错了。

换成 open_id 后一切恢复正常。没有关注公众号的新用户在使用小程序的时候也可以正常访问了。

非常感谢各位的热心帮助

__
__

------------------以下是原问题的描述--------------------

__
__

登录态的定义:

    自己业务后端给出的 JWT token,比如:eyJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoiZ1hXTSIsImNyZWF0ZWRfYXQiOiIyMDE4LTExLTE0VDE2OjM4OjQ5KzA4OjAwIn0.MmxhdbUOp3U5LA4azLeIj8nXikSWAa0gyD13NF3AXpQ

重点

这个问题的重点不是 JWT,重点是用户登录态的存储方法 (setData/globalData/setStorageSync)

最早时我是用 setStorageSync 存储 token,然后马上从"登录页"跳转到"首页"

(备注:我们小程序里只用了微信登录,完全没用手机号+密码登录或者邮箱+密码登录等方法)

另外,因为业务需求,我在"首页"加了登录检测,如果没登录就自动跳到"登录页"

造成了什么问题

在小部分情况下会造成无限跳转,永远困在登录页

具体情况:登录页->首页->登录页->首页->登录页

在我的开发者工具+真机上测不出来这样的问题。但是每次审核的时候就通过不了,每次都是不同的机型报错:

审核拒绝信息:

__
__

问题排查

在网上搜了一圈,看到了这篇文章: https://blog.csdn.net/qq_41813695/article/details/80812794

试了一下,把 getStorageSync 从 onLoad 移动到 onShow 里,并没有解决问题。

最新这一次的审核还是失败了(提示 iPhone 5S 用不了)

__
__

是否有代码可以重现?

我在本地和真机都无法复现,都是审核的时候说过不了。所以我觉得提供代码应该没啥帮助。

就是很简单的 setStorageSync 然后 getStorageSync

我的 APPID

wx3e98618e26700e1b

我想问的问题是

大家都是怎么存储登录态的?(setData/globalData/setStorageSync/其他方法)?

我的计划

(换成 globalData,因为 setStorageSync 实在不可靠,连续2次都无法过审)

10 回复

我也发现本地同步缓存有出错概率,不管是存还是取,所以用异步存wx.setStorage,用同步取wx.getStorageSync,暂时没问题。还有,同一个key,存和取之间不能太快,因为存取有时间,否则取不出来

直接保存到globaData

换成globalData就稳定正确了吗?

我以前也是用setStorageSyn来保存的openid的,直到发现getStorageSyn经常报错,回调失败,后来就全局保存了openid了

你这个问题,有没有考虑到unionid的感受?(uid:我做错了什么)

其实,应该是优先判断是否有uid,没有再走oid查询再反查uid,因为uid在任意关联小程序和web端相同的,而在不同小程序是不同的。

优点,数据统一、后期维护成本低,一定程度的降耦

缺点,需要加一个oid转uid的api,和相关处理逻辑(不偷懒就能搞^v^)

我的方法是

a>拿到openid签名和session_key,用openid和session_key做token,签名存变量用于验证

b>请求时通过id和tolen去验证用户,再验证签名(因为是变量别,人拿到的概率比较小,但就是有https被劫持伪装的风险)

目前在小程序没有被注销的情况下保持在线状态,一旦小程序被注销就得重新登录了

可以在token上加个ip就更安全了

希望对你有所帮助

一样用setStorageSync存储token这些,没什么问题啊,很丝滑。

token为什么要给到前端呢,是不是多次获取token导致前面保存的token失效呢?

我跟后端对接了这么多个小程序的登录态,我们项目也是用token,也是跟你一样做页面登录检测,没有登录会提醒用户登录或跳转登录页面,或者其他方法。也有用setStorageSync存储token的。

但是都没遇到你这种问题的。

我觉得,你的请求登录接口及成功后保存数据没有做回调后的操作,导致同步执行的问题。

我之前在另一个问题里特意问了小程序一共有几种保存数据的方法:

https://developers.weixin.qq.com/community/develop/doc/000ca8be758d80cea6a7f166756800

回到顶部