当前位置: 首页 > 资讯中心 > 业界资讯

徐州网络公司程序员介绍微信小程序用户登录态的控制问题

发布时间:2018-08-06 浏览量:
  

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

徐州网络公司程序员介绍微信小程序用户登录态的控制问题


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

  之前有玩家想使用永不过期的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进行比对,如果一致,可以证明用户曾经登录过,否则,仍需要用户进行注册

  总结

  时间是浪费了那么一些,但是进过思考摸索,代码肯定更完备了~~

  感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

最新资讯

LATEST INFORMATION

联系我们

CONTACT US