首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
01 | 初步介绍微信小程序
02 | 还有哪些其它公司的小程序产品
03 | 小程序的特点及开发能力
04 | 新的一年,微信小程序开放了哪些新功能?
05 | 小程序运行机制简介:从零构建一个Web App需要做哪些事情?
06 | 开发环境配置:创建你的第一个小程序项目
07 | icon组件:关于图标的4个实现方案
08 | progress组件:如何自定义实现一个环形进度条?
09 | rich-text组件:如何单击预览rich-text中的图片并保存?
10 | view容器组件及Flex布局(一):学习容器组件view及其重要属性
11 | view容器组件及Flex布局(二):介绍flex布局中常用的样式及样式值
12 | 可移动容器及可移动区域(一):学习使用movable-view与movable-area组件
13 | 可移动容器及可移动区域(二):如何实现侧滑删除功能
14 | scroll-view介绍:在小程序中如何实现滚动锚定?
15 | scroll-view介绍:如果渲染一个滚动的长列表?
16 | 滚动选择器(一):学习使用选择器组件
17 | 滚动选择器(二):使用两种方式自定义实现省、市、区三级联动的选择器
18 | 滑动选择器表单组件:如何基于wxs自定义一个竖向的slider?
19 | 页面链接组件:如何自定义一个导航栏?
20 | image媒体组件(上):如何实现图片的懒加载?
21 | image媒体组件(下):开发中经常遇到的问题?
22 | 如何实现直播间功能?(一):了解live-pusher、live-player组件的主要属性及使用限制
23 | 如何实现直播间功能?(二):如何开启、使用腾讯云的云直播功能
24 | 如何实现直播间功能?(三):安装与使用ffmepg,及使用ffmpeg进行推拉流验证
25 | 如何实现直播间功能?(四):使用live-pusher、live-player组件在小程序中实现直播功能
26 | 如何实现直播间功能?(五):同层渲染
27 | 如何实现直播间功能?(六):live-pusher、live-player组件在开发中的常见问题
28 | web-view(一):了解session、cookie等相关基本概念
29 | web-view(二):了解常见的四种鉴权方式
30 | web-view(三):如何使用koa框架,及如何进行热加载?
31 | web-view(四):如何在服务器端实现cookie与sesson的生成?
32 | web-view(五):如何将session存储到服务器端,及如何实现token验证?
33 | web-view(六):基于koa中间件,实现微信一键登录的后端接口
34 | web-view(七):实现微信用户一键登录
35 | web-view(八):了解正确的微信登录姿势
36 | web-view(九):web-view组件在开发的常见问题讲解
37 | WebGL介绍(一):了解WebGL相关的基础概念
38 | WebGL介绍(二):如何在小程序中取到WebGL上下文环境对象
39 | WebGL介绍(三):了解WebGL的世界坐标系
40 | WebGL介绍(四):重新认识右手坐标系及如何编写顶点着色器代码
41 | WebGL介绍(五):学习片断着色器编写,了解变量修饰变型uniform与attribute
42 | WebGL介绍(六):了解在WebGL中裁剪空间是如何裁剪出来的
43 | WebGL介绍(七):了解着色器变量值的绑定及三种三角形绘制模式之间的差异
44 | WebGL介绍(八):在着色器中使用共享变量,绘制一个颜色渐变的正方形
45 | WebGL介绍(九):完成动画
46 | WebGL介绍(十):绘制一个旋转的立方体
47 | WebGL介绍(十一):在3D绘制中使用纹理材质
48 | WebGL介绍(十二):如何创建相机、场景及光源
49 | WebGL介绍(十三):创建加载器、渲染器与控制器,完成3D模型文件的加载与展示
50 | 网络接口简介(一):如何使用wx.request接口
51 | 网络接口简介(二):将登录代码模块化封装
52 | 网络接口简介(三):Promise介绍及 6 个常用方法
53 | 网络接口简介(四):Promise三个方法any、all与race的使用介绍
54 | 网络接口简介(五):基于Promise+await、async关键字改写登录模块
55 | 网络接口简介(六):关于Page页面隐藏代码执行及Promise对象的catch处理的补充
56 | 网络接口简介(七):学习EventChannel对象
57 | 网络接口简介(八):观察者模式介绍及Event模块实现
58 | 网络接口简介(九):扩展wxp模块的request3方法,实现用户登录的自动融合
59 | tabBar组件(一):系统默认的tabBar组件如何开启及使用
60 | tabBar组件(二):基于系统提供的自定义方式,实现一个tabBar组件
61 | tabBar组件(三):通过自定义组件扩展的方式,给任意组件添加通用方法
62 | 开放接口(一):如何对Page进行全局扩展
63 | 开放接口(二):优化前后端登录代码,解决后端解密错误
当前位置:
首页>>
技术小册>>
微信小程序全栈开发实战(上)
小册名称:微信小程序全栈开发实战(上)
### 63 | 开放接口(二):优化前后端登录代码,解决后端解密错误 在微信小程序的全栈开发过程中,前后端交互的顺畅与安全性是构建高质量应用的关键。登录流程作为用户与系统交互的第一道门槛,其重要性不言而喻。本章节将深入探讨如何在微信小程序中实现高效且安全的登录机制,特别是针对常见的后端解密错误问题,通过优化前后端登录代码来确保数据的正确传输与解密。 #### 一、引言 微信小程序的登录通常依赖于微信官方提供的登录凭证`code`,通过该凭证可以在服务器端换取到用户的唯一标识`openid`和会话密钥`session_key`。然而,在实际开发过程中,由于加密方式、数据格式或传输过程中的问题,后端在解密用户信息时可能会遇到错误,导致登录失败或数据泄露的风险。因此,优化前后端登录代码,确保数据的正确加密、传输与解密,是提升应用安全性和用户体验的重要步骤。 #### 二、微信小程序端登录流程优化 ##### 2.1 获取登录凭证(`code`) 在微信小程序中,首先需要通过`wx.login`方法获取用户的登录凭证`code`。这一步骤通常在用户触发登录操作(如点击登录按钮)时执行。为了优化用户体验,可以在登录前检查用户是否已授权,避免不必要的登录流程。 ```javascript wx.login({ success(res) { if (res.code) { // 发送 res.code 到后台换取 openId, sessionKey, unionId wx.request({ url: 'https://yourserver.com/login', data: { code: res.code }, success(loginRes) { // 保存登录状态,如使用wx.setStorageSync console.log('登录成功', loginRes.data); }, fail(err) { console.error('登录失败', err); } }); } else { console.log('登录失败!' + res.errMsg); } } }); ``` ##### 2.2 加密敏感数据 如果需要在客户端向服务器发送敏感信息(如用户密码、手机号等),应使用微信提供的`encryptedData`和`iv`进行加密。但通常情况下,登录流程不直接涉及这些敏感数据的传输,而是利用`code`换取`session_key`后,在服务器端进行进一步的操作。不过,了解这一加密机制对于处理复杂业务场景下的数据安全问题是有益的。 #### 三、服务器端登录逻辑优化 ##### 3.1 接收`code`并换取`openid`和`session_key` 服务器端接收到客户端发来的`code`后,需使用微信官方提供的API(如`https://api.weixin.qq.com/sns/jscode2session`)换取用户的`openid`和`session_key`。这一步骤是登录流程的核心,也是后端解密可能出错的关键点之一。 ```python import requests def get_openid_and_session_key(code): url = "https://api.weixin.qq.com/sns/jscode2session" params = { 'appid': '你的小程序AppID', 'secret': '你的小程序AppSecret', 'js_code': code, 'grant_type': 'authorization_code' } response = requests.get(url, params=params) data = response.json() if data.get('errcode') == 0: return data['openid'], data['session_key'] else: raise Exception('获取openid和session_key失败', data) ``` ##### 3.2 优化解密逻辑 在获得`session_key`后,如果业务场景需要解密用户信息(如`encryptedData`),则需要在服务器端使用`AES-128-CBC`算法进行解密。解密过程中常见的错误包括密钥错误、填充模式不匹配、IV(初始化向量)使用不当等。 - **确保密钥正确**:`session_key`是从微信服务器获取的,必须保证在传输和使用过程中未被篡改。 - **使用正确的填充模式**:微信使用的是PKCS#7填充模式,确保解密时采用相同的填充模式。 - **IV的正确使用**:IV应与加密时使用的IV相同,且为随机生成,避免使用固定值。 ```python from Crypto.Cipher import AES from Crypto.Util.Padding import pad, unpad from Crypto.Random import get_random_bytes def decrypt_data(encrypted_data, session_key, iv): cipher = AES.new(session_key.encode('utf-8'), AES.MODE_CBC, iv.encode('utf-8')) decrypted_bytes = cipher.decrypt(base64.b64decode(encrypted_data)) decrypted_text = unpad(decrypted_bytes, AES.block_size).decode('utf-8') return decrypted_text # 注意:这里简化了错误处理,实际使用中应添加更详细的异常捕获 ``` #### 四、解决后端解密错误的常见策略 1. **检查`session_key`的有效性**:确保`session_key`未过期且未被篡改。微信小程序的`session_key`有有效期,过期后需要重新通过`code`获取。 2. **验证加密算法和填充模式**:确保使用的加密算法和填充模式与微信服务器加密时的一致。 3. **检查IV的正确性**:IV应与加密时使用的IV完全匹配,且为随机生成。 4. **错误日志记录**:在解密过程中添加详细的错误日志记录,便于问题排查。 5. **安全传输**:确保所有敏感信息(如`code`、`session_key`等)在传输过程中使用HTTPS等安全协议,防止数据被截获或篡改。 6. **单元测试**:编写单元测试,模拟各种可能的输入情况,确保解密逻辑在各种情况下都能正确运行。 #### 五、总结 优化微信小程序前后端登录代码,解决后端解密错误,是提升应用安全性和用户体验的关键步骤。通过确保`session_key`的有效性、验证加密算法和填充模式、检查IV的正确性、记录错误日志、使用安全传输协议以及编写单元测试等措施,可以有效避免解密错误的发生,保障用户数据的安全性和应用的稳定性。在未来的开发过程中,我们还应持续关注微信小程序的更新迭代,及时调整和优化登录流程,以应对可能出现的新问题和挑战。
上一篇:
62 | 开放接口(一):如何对Page进行全局扩展
该分类下的相关小册推荐:
微信小程序全栈开发实战(下)
微信小程序与云开发(中)
微信小程序与云开发(上)
微信小程序与云开发(下)
微信小程序底层框架实现原理
微信小程序全栈开发实战(中)