这种登录流程是否可行?
发布于 4 年前 作者 yaoming 17256 次浏览 来自 问答

调用wx.login,后台进行一系列操作后,返回小程序一个数据库自增的id,保存到小程序本地,没有过期时间。之后的业务逻辑都是用这个id与后台交互,这样就没有用到官方流程里的3rd_session之类的,请问这种方式可以吗?有什么不足吗?

6 回复

刚试了切换账号登陆,两个账号的缓存不是互通的。

你说的这个登陆流程我之前试过,但是这样用户每次打开小程序都需要登陆一次,接口返回特别慢,我的方法是直接把用户id存到本地缓存,用户进来检查是否存在id再决定是否登陆

缓存不通用就安全了,可以把 session id 长期缓存,以减少 wx.login 的次数。不过也不宜太长,否则昵称、头像更改会很难反映出来。

wx.login 的目的无非是拿到 code 并进而得到 openid, nickName, avatarUrl 这些,openid 是一成不变的,如果你也不在意昵称、头像的修改,那其实就没啥必要再次调用 wx.login,当然也就不需要 wx.checkSession 了。

忽然想到一种非典型的应用场景:如果一部手机上微信用户注销后用另一个微信帐号登录,此时“小程序保存在本地的 id”会不会是同一份呢?如果是的话就有问题了,相当于两个不同的微信用户被当做了同一个小程序用户。

我在小程序里的做法是:小程序启动的时候调用一次 wx.login,在服务器端根据 openid 生成对应的 session id,在小程序端以内存变量的方式来缓存这个 session id,从不调用 wx.checkSession,只要缓存有效就不再调用 wx.login。

@maq: 那这么说就不需要checksession这个方法了吧?

你这个 id 已经就是“官方流程里的3rd_session”了。

数据库自增的 id 不好,太容易伪造了,应该用一种可校验的加密字符串,比如 PHP 里可以用著名的 authcode()。

回到顶部