首页
技术小册
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 | 开放接口(二):优化前后端登录代码,解决后端解密错误
当前位置:
首页>>
技术小册>>
微信小程序全栈开发实战(上)
小册名称:微信小程序全栈开发实战(上)
### 章节 32 | web-view(五):如何将session存储到服务器端,及如何实现token验证 #### 引言 在微信小程序的全栈开发过程中,`web-view` 组件扮演着桥梁的角色,它允许小程序内嵌网页内容,实现更丰富的交互体验和功能扩展。然而,由于小程序与原生Web环境在会话管理、数据存储等方面存在差异,如何在小程序与内嵌的网页之间安全、高效地共享用户状态,成为了开发者需要面对的重要问题。本章节将深入探讨如何在服务器端存储session信息,并通过token验证机制来确保用户身份的安全与验证,进而在小程序与`web-view`之间实现无缝的用户体验。 #### 一、将Session存储到服务器端 在Web开发中,Session是一种用于跟踪用户会话状态的机制,它允许服务器在多个请求之间保持用户的上下文信息。然而,在微信小程序中直接操作Session并不直接可行,因为小程序本身不提供原生的Session管理机制。因此,我们需要通过服务器端来实现Session的存储与管理。 ##### 1.1 选择合适的后端技术栈 首先,你需要选择适合的后端技术栈来支持Session的存储。常见的后端技术如Node.js、Java、PHP等都可以胜任这一任务。以Node.js为例,结合Express框架和Redis这样的内存数据库,可以高效地实现Session的存储与访问。 - **Express框架**:用于构建Web和移动应用程序的后端,提供了丰富的中间件支持,易于扩展。 - **Redis**:作为高速缓存和消息代理,Redis非常适合存储Session数据,因为它支持快速的读写操作,并且数据存储在内存中,访问速度极快。 ##### 1.2 Session管理机制的实现 在确定了后端技术栈后,接下来是实现Session管理机制。以Node.js + Express + Redis为例,可以通过以下步骤实现: - **安装必要的npm包**:如`express-session`(用于Session管理)和`redis`(用于与Redis数据库交互)。 - **配置Session中间件**:在Express应用中配置`express-session`中间件,指定使用Redis作为Session的存储后端,并设置相应的Redis连接参数。 - **Session数据的存取**:通过Session中间件,你可以在请求处理函数中轻松存取Session数据,如用户ID、登录状态等。 ```javascript const express = require('express'); const session = require('express-session'); const RedisStore = require('connect-redis')(session); const app = express(); // Redis配置 const redisClient = require('redis').createClient({ // Redis服务器配置 }); redisClient.on('error', function(err) { console.log('Redis Client Error', err); }); // Session配置 app.use(session({ store: new RedisStore({ client: redisClient }), secret: 'your_secret_key', // 用于签名session ID cookie的密钥 resave: false, // 强制保存session,即使它并没有变化 saveUninitialized: false, // 强制创建未初始化的session cookie: { secure: false } // 设置为true时,cookie只能通过HTTPS发送,但小程序内嵌网页可能通过HTTP访问 })); // 路由处理函数 app.get('/login', (req, res) => { // 登录逻辑,设置Session req.session.userId = '12345'; res.send('登录成功'); }); app.get('/profile', (req, res) => { // 访问用户信息,从Session中获取 if (req.session.userId) { res.send(`用户ID:${req.session.userId}`); } else { res.send('未登录'); } }); // 启动服务器 app.listen(3000, () => { console.log('Server is running on port 3000'); }); ``` #### 二、实现Token验证 虽然Session机制在Web开发中非常普遍,但在微信小程序与`web-view`的交互中,使用Token进行身份验证更为常见和灵活。Token是一种轻量级的身份验证机制,它允许客户端在每次请求时携带一个令牌(Token),服务器通过验证这个令牌来确认用户的身份。 ##### 2.1 Token的生成与分发 Token的生成通常涉及到以下几个步骤: - **用户认证**:用户通过用户名和密码或其他认证方式进行登录。 - **生成Token**:服务器在用户认证成功后,生成一个包含用户信息(通常是加密或签名的)的Token。常用的生成Token的库有`jsonwebtoken`(JWT)。 - **分发Token**:将生成的Token返回给客户端,客户端通常在本地存储这个Token,并在后续请求中携带它。 ```javascript const jwt = require('jsonwebtoken'); // 用户登录成功后的Token生成与分发 function generateToken(userId) { const token = jwt.sign({ userId: userId }, 'your_secret_key', { expiresIn: '1h' }); // 设置Token过期时间为1小时 return token; } // 登录接口 app.post('/login', (req, res) => { // 假设这里已经完成了用户认证 const userId = '12345'; // 用户ID const token = generateToken(userId); res.json({ token: token }); }); ``` ##### 2.2 Token的验证 在服务器端,每个需要验证用户身份的接口都应该包含Token验证的逻辑。当请求到达时,服务器首先从请求头(如`Authorization`字段)或请求体中提取Token,然后使用相同的密钥和算法验证Token的有效性。 ```javascript // Token验证中间件 function verifyToken(req, res, next) { const authHeader = req.headers['authorization']; const token = authHeader && authHeader.split(' ')[1]; if (token == null) return res.sendStatus(401); // 如果没有Token,则返回401错误 jwt.verify(token, 'your_secret_key', (err, user) => { if (err) return res.sendStatus(403); // 如果Token验证失败,则返回403错误 req.user = user; // 将验证后的用户信息添加到请求对象上,供后续使用 next(); // 继续执行下一个中间件或路由处理函数 }); } // 需要验证Token的接口 app.get('/protected', verifyToken, (req, res) => { res.send(`受保护资源,用户ID:${req.user.userId}`); }); ``` #### 三、在微信小程序中使用Token 在微信小程序中,你可以通过`wx.request`接口发送网络请求,并在请求头中携带Token。当用户首次登录成功后,小程序应该将Token保存在本地存储(如`wx.setStorageSync`),并在后续请求中通过`header`字段将其发送给服务器。 ```javascript // 发送带有Token的请求 function fetchDataWithToken() { wx.getStorageSync('token').then(token => { wx.request({ url: 'https://your-server.com/api/data', method: 'GET', header: { 'Authorization': `Bearer ${token}` }, success: function(res) { console.log('请求成功:', res.data); }, fail: function(err) { console.error('请求失败:', err); } }); }).catch(() => { console.error('Token未找到'); }); } ``` #### 结论 通过将Session存储在服务器端,并结合Token验证机制,我们可以在微信小程序与`web-view`之间实现安全、高效的用户状态共享与身份验证。这不仅提升了用户体验,还增强了系统的安全性。在实际开发中,根据项目的具体需求和安全要求,开发者可以灵活选择使用Session或Token,或者两者结合使用,以达到最佳的效果。
上一篇:
31 | web-view(四):如何在服务器端实现cookie与sesson的生成?
下一篇:
33 | web-view(六):基于koa中间件,实现微信一键登录的后端接口
该分类下的相关小册推荐:
微信小程序底层框架实现原理
微信小程序全栈开发实战(下)
微信小程序与云开发(下)
微信小程序与云开发(中)
微信小程序全栈开发实战(中)
微信小程序与云开发(上)