收藏
回答

(已解决)大家怎么保存登录态的?实测 setStorageSync 似乎不可靠

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

不是 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次都无法过审)


最后一次编辑于  2018-11-16  (未经腾讯允许,不得转载)
回答关注问题邀请回答
收藏

10 个回答

  • A 明月🌙
    A 明月🌙
    2018-11-19

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

    2018-11-19
    赞同 1
    回复 1
    • 郑诚(Zheng Cheng)
      郑诚(Zheng Cheng)
      2018-11-21

      感谢回复~ 问题已解决

      2018-11-21
      回复
  • Administration
    Administration
    2018-11-19

    我的方法是

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

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


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

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


    希望对你有所帮助

    2018-11-19
    赞同 1
    回复 2
    • Administration
      Administration
      2018-11-19
      1. _token: dd1f689cf15216b7e78374a1204c4354cb87077a678c028f369d9a02858e585f76dd70d2

      2. _myid: 1


      token里有一部分是签名,一部分是openid+session_key的md5

      2018-11-19
      回复
    • 郑诚(Zheng Cheng)
      郑诚(Zheng Cheng)
      2018-11-26回复Administration
      感谢回复~
      2018-11-26
      回复
  • Snail先森💕จุ๊บ
    Snail先森💕จุ๊บ
    2018-11-15

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

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

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


    2018-11-15
    赞同 1
    回复 1
    • 郑诚(Zheng Cheng)
      郑诚(Zheng Cheng)
      2018-11-16

      好,感谢回复,会多排查,有结论了会贴出来到问题描述里。帮助其他人

      2018-11-16
      回复
  • 呼吸🎯
    呼吸🎯
    2018-11-27

    直接保存到globaData

    2018-11-27
    赞同
    回复
  • 往事难忆
    往事难忆
    2018-11-19

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

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

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

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

    2018-11-19
    赞同
    回复 1
    • 郑诚(Zheng Cheng)
      郑诚(Zheng Cheng)
      2018-11-21

      感谢详细的回复。我虽然换成了 open_id 的登录方式。但是 unionid 也会保存下来。方便以后有需要的时候可以用上。再次感谢

      2018-11-21
      回复
  • phoenixor
    phoenixor
    2018-11-18

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

    2018-11-18
    赞同
    回复
  • 。
    2018-11-17

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

    2018-11-17
    赞同
    回复
  • 卢霄霄
    卢霄霄
    2018-11-15

    换成globalData就稳定正确了吗?

    2018-11-15
    赞同
    回复 2
    • 郑诚(Zheng Cheng)
      郑诚(Zheng Cheng)
      2018-11-15

      我还没改成 globalData 方式,因为在一些微信群里和其他开发者聊天大家都觉得这是个很奇怪的事情。而且我在开发者工具和真机用测试版中均无法复现这样的问题。实在奇怪。我给几个页面底部加了文字:版本 1.7.0。我再原样提交一次,看看情况如何。如果有结果了我会回来更新的。把解决方法说出来。

      2018-11-15
      回复
    • 卢霄霄
      卢霄霄
      2018-11-15回复郑诚(Zheng Cheng)

      哦哦。。直觉上感觉可能是异步的问题

      2018-11-15
      1
      回复
  • 管凯旋
    管凯旋
    2018-11-15

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

    2018-11-15
    赞同
    回复 5
    • 郑诚(Zheng Cheng)
      郑诚(Zheng Cheng)
      2018-11-15

      首先感谢回复。1. token 给到前端,是为了之后每次 http 请求都带上,发给后端。后端这样才知道是哪一个用户。

      是为了鉴别用户身份。2. "是不是多次获取token导致前面保存的token失效呢?" 我再排查一次然后来说结果,稍等哈。不排除是我自己脑残把代码写错了

      2018-11-15
      回复
    • 管凯旋
      管凯旋
      2018-11-15回复郑诚(Zheng Cheng)

      区分用户可以通过token获取到的openID比较好一点吧,openId是用户身份的唯一标识

      2018-11-15
      回复
    • 郑诚(Zheng Cheng)
      郑诚(Zheng Cheng)
      2018-11-15回复管凯旋

      哦说明一下,我这里说的 token 指的是我们后端自己颁发的 JWT token,并不是微信登录时所说的 token。我这里微信登录的逻辑是,拿 code 发给后端,后端最终拿到 unionID,然后在数据库里对比,找得到就登录,找不到就新建用户。总之最终一定是返回一个 JWT token 给微信小程序(再次感谢热心答复)

      2018-11-15
      回复
    • 管凯旋
      管凯旋
      2018-11-15回复郑诚(Zheng Cheng)

      自己真机测试连外网不开调试,流程应该没啥问题,官方能测出来先自己测试复现再查问题呗

      2018-11-15
      1
      回复
    • 郑诚(Zheng Cheng)
      郑诚(Zheng Cheng)
      2018-11-15回复管凯旋

      好的。感谢思路

      2018-11-15
      回复
  • 郑诚(Zheng Cheng)
    郑诚(Zheng Cheng)
    2018-11-15

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

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

    2018-11-15
    赞同
    回复