重庆微信小程序开发,小程序开发公司,微信运营,朋友圈广告,重庆公众号营销,重庆做小程序 重庆小程序开发公司

新闻详情

真正解决微信小程序用户登录态的控制问题

  • 发布时间: 2018-04-04 09:50:35

下一新闻

      之前在这篇文章分享了,微信小程序的用户登录态是如何进行维护的?。这样一个方法。但是并不具体,很多用户看了之后并不知道应该怎么样去做。今天我们就详细的分析如何去做,当然我不会直接分享代码,因为程序代码因人而异,你可以这样写,我可以那样写。所以我只分享原理,介绍方法,至于具体的编程实现,相信对于正在阅读这篇文章的你不算什么。

      好了废话不多说,下面进入干货时间:

      之前有玩家想使用不过期的opind来进行用户登录态的维护,但是导致了很多问题:

      一:永不过期的openid一旦被截取,那么这个用户的所有数据就全部透明了!这是非常危险的!!!

      二、如果使用永不过期的openid缓存在本地来维护用户登录态会导致用户数据乱传!何为乱传,用户A使用小程序获取到了opid并缓存,如果这时候用户在同一设备切换了微信账号用户B,再次进入微信小程序,这时候已经有缓存的用户A的openid,这时候就不会提示登录。这时候用不B就使用的是用户A的数据!这也是非常危险的!!!


      好了,看来我们还是使用微信官方推荐的使用自定义3rdsessionid来解决了。

      维护3rd_session需要一个内存数据库,这里我选用了redis
      维护会话态是内存数据库的典型应用场景,毕竟量小,并且要求速度快,这么一个小应用,当然也可以自己在内存中维护一个对象来进行会话id的处理,但是肯定难以跟一个成熟的系统相媲美
      抛开代码实现,这似乎就是一句话可以概括的事情,生成一个唯一的随机串sessionid,以此为key,openid和微信方的session_key为value存入redis,并把sessionid传回给客户端。
      但是,翻遍小程序的官方文档,除了一句据说的wx.checkSession对开发者来说是透明的,并没有小程序登录态何时过期的具体说明,如何才能同步前后端的会话过期时间呢?
      前后端会话过期时间同步
      如果wx.checkSession检测到会话失效,那么带上已经缓存在本地的sessionid(如果有的话),重新发起登录请求,后台从code2session中拿到新的请求结果后,生成新的随机sessionid并入库reids,并且把老的sessionid移除(如果有的话)
      当然不移除也不会带来什么功能上的影响,但是会存在两个问题,首先,跟使用open_id作为登录凭证一样,旧的sessionid永不过期,其次,无用的session数据占用redis资源,会拖垮访问性能。
      为了统计使用小程序的用户数,需要一个表来保存用户数据,后台提供一个接口,让小程序将用户数据传上来进行一个注册操作,当然可以把这个功能合并到登录接口上,每次登录都把前端小程序获得的微信用户数据带上,如果发现数据库中还没有该用户的信息,则进行入库操作
      不难发现,其实只需要用户第一次登录的时候注册一次就行了,所以上述方法虽然简便,但是有点浪费带宽,所以应该额外提供一个注册接口,登录接口只需要返回一个用户是否已经注册的标志,让客户端决定是否需要获取用户信息,进行注册操作(当然后台也不会让同一个用户重复入库)
      那么问题就变成如何判断用户是第一次登录了:
      1)判断登录请求中有没有带上sessionid,如果没带上,肯定是第一次登录;如果带上了就是登录过的用户?不,别忘了,前面说过,用户可能会在同一设备切换账户,那就有可能在登录接口中带上了别人sessionid,那并不能表明用户曾经登录过
      2)通过带上来的sessionid从redis中拿到openid,跟在code2session新请求到的openid进行比对,如果一致,可以证明用户曾经登录过,否则,仍需要用户进行注册
      总结
      时间是浪费了那么一些,但是进过思考摸索,代码肯定更完备了~~
      感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!