最近发现了一些关于小程序登录逻辑的新见解,所以记录一下。 1.个人对官方微信小程序登录流程的理解
小程序官网会提到小程序的登录逻辑。这是官方推荐的登录逻辑,也是所谓的小程序登录状态维护逻辑。这是官方图:
个人理解官方逻辑:
用户打开微信小程序。
小程序通过wx.获取微信代码,然后将这个代码发送到开发者服务器(我们自己的开发服务器)。
开发者服务器收到代码后,对其进行封装,通过该API接口获取真正需要的微信用户的登录状态和登录状态。
那么开发者服务器需要生成一个自定义的登录状态(比如业务或)来保存这些微信服务器返回的微信登录状态相关信息(sum和sum),进行关联处理,然后返回给小程序客户端。
小程序客户端接收返回的自定义登录状态信息来判断用户是否登录成功。如果登录成功,则将自定义登录状态信息保存到本地存储。
小程序客户端访问业务接口时,会携带之前保存到本地存储的自定义登录状态信息来访问开发者服务器(业务接口服务器)。
开发者服务器的业务接口接收请求,请求中携带定制的登录状态。验证通过后,将返回相关信息。
这是官方推荐的整个微信小程序的登录状态维护流程。官方建议使用自定义登录状态对整个微信小程序进行登录维护。既然依赖别人,就必须按部就班,遵守政策。这是最好的回应。 。
上图中部分术语的解释:
,用户在微信中的唯一标识符,但是需要和流程一起理解。
,如果开发者拥有多个移动应用、网站应用、公众号(包括小程序),可以通过(包括小程序)来区分用户的唯一性,用户的是唯一的。也就是说,同一个用户在同一个微信开放平台下,对不同应用的访问权限是相同的。
一般是指开发者服务器的登录状态,也就是自定义登录状态,也就是我们自己公司业务服务器的登录状态(微信官方建议使用自定义登录状态来管理整个微信小程序登录)。
通过微信返回的信息可以了解小程序的登录状态。自定义登录状态是开发者服务器创建的,也是业务的登录状态。一般是指我们企业自己的。官方是这么说的。通常,自定义登录状态的管理将使用类似的方法进行管理。这还涉及到自定义登录状态的缓存策略。缓存后,在一定时间内无需重新创建自定义登录状态,实现优化。性能影响。只有了解了官方的标准流程,才能更好的理解其他流程,或者说别人对官方流程的封装和注释! 2.扩展微信小程序登录流程
以上就是对登录流程的基本了解,但是在实际业务中还是有一些需要补充的地方,不过我们理解的时候最好将它们分开,这样会更清晰、更简单。
按照官方推荐的方法,采用自定义登录状态来管理整个微信小程序登录流程。虽然是通过自定义登录状态进行管理,但实际上还是有修改的。
这里有两种方法:
方法一:打开小程序时,首先检查小程序本地是否存储有自定义登录状态。
方法二:小程序打开时,先启动wx.检查微信登录状态是否已过期:
如果过期,则会启动完整的登录过程。如果未过期,则继续使用本地保存的自定义登录状态。 (如果本地没有自定义登录状态,则必须强制发起完整的登录流程)
上面提到的方法都是在打开小程序的时候完成的,但是还必须考虑一种情况,那就是用户在使用小程序的过程中自定义的登录状态过期了,所以这时候也需要强制完成登录过程。的。
相对而言,第二种方法更好。第二种方式的优点是不需要小程序服务器参与验证,而是调用小程序端的API。这种方式实际上是将登录状态的维护机制委托给了微信,开发者不需要在自定义的登录状态中保存有效期信息。腾讯云开发的项目就采用了这种方式。 3.继续扩展微信小程序登录流程。上面提到的第二种方法是在打开小程序时进行的。这里每次发起HTTP请求时都会执行此操作。这是不同的逻辑。
当小程序客户端访问该接口时,开发者服务器返回您的自定义登录状态已过期,需要您重新发起完整登录,但有两点需要注意:
由于 HTTP 是无状态的,因此它无法跟踪状态。发起HTTP请求,服务器返回自定义登录状态过期结果。然后就结束了。没有办法临时存储原始 HTTP 请求,以便当我们有可用的自定义登录名、状态时继续使用它。所以我们需要在发起HTTP请求时进行判断,看是否需要发起一个完整的登录流程。在小程序中,经常需要访问开发者的服务器。但是如果每个接口都需要这样直接判断,就会产生大量冗余代码,而且没有办法维护。如果登录流程发生改变,所有的代码都被改变了。
所以这里需要封装一下。这里提到,想法是正确的,但是你可以根据自己的需求来实现。他有两个地方描述得很好,我就搬过来学习一下。
这是宏观的看法。每个请求都要检查登录状态的逻辑图:
图片引用自:
每个请求都会检查登录状态,是自定义登录状态还是微信登录状态。不管怎样,在发起HTTP请求与开发者服务器交互之前都会进行检查。
如果你分解逻辑,它会是这样的:
图片引用自:
细分逻辑后看起来会更清晰,这里的逻辑是微信登录状态和自定义登录状态都会被检查。如果任何登录状态过期,则会启动完整的登录逻辑。其实我觉得这里也只能判断自定义登录。国家的状态也是可以的。
不过这也带来了一个问题,就是如果一个页面同时发起多个请求,那么会同时检查登录状态过期,然后同时发起登录。该问题可能会导致开发者服务器需要校准。验证登录数据时出现问题。他使用.race来解决这个问题。具体你可以阅读他的文章中的介绍。后面我会继续写这个处理的介绍。
参考文档: