小程序使用微信登录的优势
玩过小程序的同学都知道,很多小程序都是使用微信登录的,其实小程序并没有强制要求只能使用微信登录,我们完全可以像web网站一样使用用户名、邮箱、手机号、密码等登录方式,既然如此,为什么大多数的小程序还是使用微信登录呢,因为除了便利性以外,微信登录更重要的优势是整合了微信庞大的生态系统,以及对于产品策略的加持。
可以从以下三个角度理解小程序使用微信登录的优势:
- 从生态系统的角度上, 相对于其他应用端,以微信为入口的小程序最大的优势是拥有微信完善的生态系统,用户使用微信登录后可以使用微信提供给小程序的各种平台级能力,比如订阅消息、微信支付等。
- 从用户体验的角度上, 用户能够很大程度上降低登录的复杂程度。想象一下,对比在小程序内用用户名密码登录和一键微信登录,哪种方式更容易被用户接受呢?结果不言而喻。
- 从产品策略的角度上, 使用微信登录小程序能够根据用户的来源,制定特殊的产品策略,比如对于小程序的用户发放专属的优惠券。
所以,可以得出小程序使用微信登录的三个主要优势:
- 融入微信生态
- 提高用户体验
- 制定产品策略
既然它这么有优势,那当然很有必要了解一下它的登录流程,其实微信官方文档也介绍了微信登录的过程,小程序登录-微信官方文档,可以直接从微信官方文档学习。
下面这张图是微信官方文档给的,描述了小程序登录的整个过程。我们借助它来摸清微信登录的逻辑。
相信很多人第一次看到这张图的时候没看个几遍是看不懂的,特别是对于刚接触小程序的同学来说,图中整个流程涉及到了三种角色,六个术语,先理解他们的定位和含义,是我们看懂这个流程图的基础。
首先,三种角色分别是小程序(客户端),开发者服务器(开发者自己的服务器),微信接口服务(微信处理登录请求的服务):
-
客户端既是整个登录流程的发起者,获取临时登录凭证code,也是整个登录流程的终结者,存储登录态令牌token。
-
不过客户端的所有信息和网络请求几乎都是可以被破解或拦截的,所以出于安全的考虑,小程序登录流程中的一些借口被限制不能在客户端中直接调用,而是需要在服务端发起,开发者服务的工作就是处理这些安全敏感的网络请求,体现为上图中使用code获取openid和session_key的请求,这个请求使用了微信提供的auth.code2Session接口。
-
而微信接口服务的工作对于开发者来说是不透明的,我们仅需要根据接口的规范,组装网络请求发送给它,然后根据返回的接口执行分发逻辑,微信服务器会验证网络请求的合法性,对于合法请求下发密钥session_key和用户openid
六个术语分别是code、appid、openid、appsecret、session_key、token:
- code:小程序通过wx.login() API获取的,然后通过HTTP请求发送给开发者服务器,code强调’临时’两个字,有效期仅5分钟,并且仅能够使用一次,下次用需要重新获取。
- appid:每个微信小程序在创建之后便会生成一个appid,标记了小程序的唯一性,等同于网站的URL(经过备案的)、APP的包名等标记应用唯一性的信息。
- openid:微信号在某个应用程序中的唯一 ID。这里的“某个应用程序”指的是小程序、公众号、接入开放平台的应用。微信生态中目前有公众平台和开放平台两种,其中公众平台又细分为小程序和公众号,开放平台可以接入网站、移动应用等。同一个微信号在不同的应用程序中有不同的 openid。说得直接点就是,你在拼多多小程序的openid肯定是唯一的,但是你在拼多多小程序的openid和你在腾讯游戏小程序的openid肯定是不一样的。
在微信生态下另外有一个标记微信号的唯一 ID:UnionId。这个 ID 跟应用程序无关。所以,可以简单地理解为 UnionId 与 appid 综合加密后的结果。UnionId 通常用来关联在不同应用程序中各个 openid ,比如同一个微信号在小程序和公众号内需要配置同样的权限,仅通过 openid 无法实现,便需要获取此微信号的 UnionId。
- appsecret:它是小程序的密钥,可以在微信公众平台的后台管理系统中获取。appsecret 是非常私密的信息,所以微信在制定小程序登录的流程时,将携带此信息的网络请求限制在只能通过开发者服务器发送给微信接口服务,这样对于客户端来说是不可见的,进而降低了被泄露的可能性。与appid 不同的是,appsecret 可以被重置,但每次重置之后,历史的 appsecret 便会失效,所以请谨慎操作。
- session_key:是对用户数据进行加密签名的密钥,微信服务器使用它将用户的数据进行加密和解密,可以简单地将session_key理解为获取用户数据的’绿卡’,登录之后所有涉及访问微信服务器的请求一般都要带上它,微信服务器会校验session_key的合法性。其实到这一步(即拿到了 openid 和 session_key )已经完成了小程序的登录流程,但对于一个应用程序来说,用户进行登录操作应该是’一劳永逸’的,即登录过一次之后在一定时间内的后续操作都不需要再次登录,用技术言语描述就是应该保存用户的登录态,也就是token
- token:登录态是个逻辑词汇,token可以理解为登录态的具象化、数据化,在上面的流程图中,可以看到token是由开发者服务器创建的一个字符,而且需要跟openid和session_key相关联,关联完成之后开发者服务器将 token下发到客户端,客户端保存在本地,后续的所有请求均需要携带此 token,携带的方法并没有既定的规范,可以通过 URL Query、HTTP Body、Header 等,但通常建议通过 Header 传递,这样相对来说更安全一些。
我觉得看流程图最好理解的方式就是跟着画一遍,可能我的悟性不够,总觉得要自己也画一遍,理解了才算真正理解,说到画流程图,我就想安利vscode的一个插件,