提了问题一天后,问题解决了:
不是 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次都无法过审)
你这个问题,有没有考虑到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就更安全了
希望对你有所帮助
我跟后端对接了这么多个小程序的登录态,我们项目也是用token,也是跟你一样做页面登录检测,没有登录会提醒用户登录或跳转登录页面,或者其他方法。也有用setStorageSync存储token的。
但是都没遇到你这种问题的。
我觉得,你的请求登录接口及成功后保存数据没有做回调后的操作,导致同步执行的问题。
我之前在另一个问题里特意问了小程序一共有几种保存数据的方法:
https://developers.weixin.qq.com/community/develop/doc/000ca8be758d80cea6a7f166756800