微信小程序在一般情况下,是免登录的,秉承了小龙的用完即走的理念。除非我们需要获取用户的信息,如用户微信昵称、头像 、地理位置 等,需要我们获取用户的一些信息。微信官方提供了相关的API
。具体可参见:获取微信用户信息。
但是在某些特殊的运用中,仅仅只获取登录用户的信息是远远不够的。一般稍微有点复杂商业逻辑的小程序都会有自身的用户体系,并且前后端通信时需要对用户进行 认证 或者 权限 的判断。小程序必须要经过微信账户的验证授权,然后再与 第三方服务器(也就是我们自己的服务器)通信实现用户的登录。这里面就涉及到微信账户信息与第三方用户信息的 耦合。
登录原理
首先,我们总结一下其实登录就是要保证2个问题:
- 登录状态保存
- 安全验证
登录状态保存 就是登录成功后请求站内数据接口时无需再次登录,客户端与服务器按照既定的规则进行用户有效性验证。
安全验证 是为了应对流量劫持,防止中间人攻击,在我们的页面中插入乱七八糟的内容。https可以应对绝大部分的应用场景,有效的防止流量劫持,所以微信小程序的前后端通信微信官方强制大家使用https,也是基于这方面的思考。但道高一尺,魔高一丈,程序猿的智慧是无穷的。市场上层出不穷的黑科技软件,如 Fiddle , Charles 。2017 年初风靡的刷跳一跳的得分,就是靠着这些工具获取到用户的隐私信息的。其实就是利用了工具作为中间人,抓取了隐秘数据。话说,我们可以利用这些工具破解小程序源码的。这个我可以再写一篇文章和大家分享分享。
好了,明白了上面的2个概念。我们回顾一下传统基于浏览器的应用是如何解决这个问题的。浏览器环境下的登录状态保存通常使用cookie实现,这种方案的实现原理是浏览器发出的http请求的header中会携带客户端的cookie。如下图:
自定义安全验证 通常的方案是客户端与服务器约定好一个验证签名,客户端在发出http请求之前按照约定好的算法计算出一个签名字符串,并且在http请求中将计算签名的参数传递给服务器。服务器接收到请求之后,解析出签名字符串和客户端传递的计算参数,然后按照同样的算法计算出签名字符串,并将其与客户端的签名进行对比,完全一致则验证通过,否则返回验证未通过的数据。如下图:
我们来看一个例子,先简单点,就不加上图中加密算法之类的。我们直接生成令牌,作为通信的签名,来,我们一起撸一遍:
通过上一轮的操作,我们就在服务器端生成了用户登录认证信息,并将此信息保存到了客户端的cookie
中。之后我们就可以通过这个认证信息在服务端进行判断,来,翠花,上代码:
这样,运用面向切面编程或者在filter
在之后的用户请求中,我们就可以判断这是否是当前真实用户的真实请求。如此,我们可以过滤掉恶意攻击和一些爬虫啦。
通过上面的实例,我们了解了基于浏览器应用的用户登录机制原理。上述流程成立的前提条件是:
- 浏览器可以获取到
UA
信息 - 浏览器发出的
http
请求header
中会携带UA
信息,服务器可以获取
那么,我们是否可以将这套机制复用到小程序开发中去呢?很不幸,答案是否定的。因为,小程序存在以下限制:
- 不支持
cookie
,所以使用cookie
储存登录状态的方案不可行;