微信小程序(抖音小程序):手机号码解析失败解决方案

小程序开发


浏览:2044 次

小程序开发中,可能需要用户授权才能获取用户信息,这涉及到手机号码等敏感数据。一般的小程序开发平台会对数据进行加密,然后通过对称加密算法对其进行加密和解密。在获取手机号码的过程中,由于对过程的错误理解,可能会出现解密手机号码的问题。本文介绍了一种更适用的解决方案,希望能给遇到坑的学生提供参考。

1问题描述

本文以抖音小程序(微信小程序的获取过程与界面相同)为例。最近,这位博主正在做抖音小程序的一个小项目。当前端获得用户的手机号码时,需要调用界面登录。登录后,它返回一个代码,该代码的到期时间为3分钟。根据此代码,可以获得sessionKey。此sessionKey类似于对称加密密钥,用户信息将被加密。当获取用户信息时,前端

需要<button>组件打开类型的值设置为getPhoneNumber。用户单击后,将弹出一个授权弹出窗口供用户确认(如果用户帐户未绑定手机号码,则将执行绑定手机号码的过程;每次使用时都会弹出授权弹出窗口)。在用户同意后,开发者可以通过bindetphonenumber事件回调获得加密数据,开发者可以将数据发送回他的服务器以解密并获得手机号码。

需要使用sessionKey对获得的加密数据进行解密。因此,在获取用户信息之前,您需要登录一次以获取代码,然后根据代码获取sessionKey。然后,您可以根据sessionKey对加密数据进行解密,以解析手机号码。

根据博主的猜测,登录后,抖音会生成一个代码和相应的sessionKey。当在会话期间获得用户信息时(会话尚未过期),用户信息将使用sessionKey加密,sessionKey也将用于数据解密。代码和sessionKey是对应的,但它们的到期日期不同。代码到期日期为3分钟,sessionKey到期时间可变。只要用户在页面上处于活动状态,它就不会变为无效。在获得代码后3分钟内调用接口,将获得sessionKey。如果3分钟后根据代码获得sessionKey,检索将失败,因此解密也将失败。

1.1初始实施

因为无法确定用户何时开始获取用户信息,一旦用户进入页面,前端就会调用界面登录,然后将其放入本地存储缓存。当用户点击按钮时,会弹出一个授权框,确认用户对用户信息的加密数据的访问,然后前端会将缓存的代码和加密数据传输到后端。后端使用代码调用接口以获取sessionKey,然后使用sessionKey作为AES解密的密钥。获得的移动电话号码返回到前台。整个过程似乎还可以,但一旦用户在页面上停留超过3分钟,然后尝试获取用户信息将失败,主要是因为代码已过期,sessionKey的获取将失败。

图像.png

2解决方案

2.1缓存会话密钥

当前的问题是,在代码的有效期到期后,它无法根据代码获取sessionKey。前端登录获得代码后,首先在本地缓存代码,然后立即调用后台接口获取sessionKey,然后将其缓存在Redis中。键是代码,值是sessionKey。过期时间取决于您的业务设置(小程序页面用户不会停留太久,因此缓存过期时间设置为30分钟)。用户退出小程序后,将再次登录,然后保存新代码和sessionKey的相应值。

在用户被授权访问用户信息后,前端直接将缓存的代码和加密的用户信息上传到服务进行解密。服务器首先根据代码从缓存中获取sessionKey,然后用sessionKey解密,解析电话号码并返回。

图像.png

2.2存在问题

以上解决方案基本上每次都可以获得手机号码,但也存在一些问题

将有大量冗余数据:b