
基于STM32的物联网环境监测与远程控制系统实训套件-淘宝网任务1 生成OneNet平台鉴权Token一、任务描述本任务基于微信小程序开发环境借助 crypto-js 加密库与自定义工具文件 key.js按照 OneNet 平台官方签名规则生成通信鉴权 Token。实现加密算法封装、鉴权字符串生成功能为后续小程序请求 OneNet 物联网平台、读取设备传感器数据、下发控制指令提供身份凭证掌握小程序前端加密、接口鉴权的基础开发流程。二、任务目标1.知识目标1理解 OneNet 平台 HTTP 接口 Token 鉴权原理与签名规则。2掌握 crypto-js 加密库的作用与基本使用方法。3掌握小程序自定义工具文件 key.js 的封装逻辑与模块引用方式。4了解时间戳、随机数、HmacSHA1 加密、Base64 编码在签名中的应用。2.能力目标1能够完成 crypto-js 加密库手动导入与目录部署。2能够独立编写 key.js 工具文件封装 OneNet Token 生成函数。3能够在小程序页面中正确引用工具方法调用函数生成有效 Token。4能够通过开发者工具控制台验证 Token 生成结果排查路径、加密异常问题。3.素质目标1养成代码分层、功能模块化封装的编程习惯。2提升文件目录管理、模块引用、接口鉴权问题排查能力。3树立物联网平台密钥安全使用、规范开发的工程意识。三、任务重难点1.任务重点1crypto-js 加密库文件部署保证文件路径引用正确。2key.js 工具文件编写参数拼接、HmacSHA1 加密、Base64 编码完整逻辑。3小程序页面引入工具函数调用方法生成 Token 并存储。4理解 Token、APIKey、时间戳、随机数在鉴权中的作用。2.任务难点1严格遵循 OneNet 签名规则保证加密流程与编码格式无误。2小程序文件相对路径书写解决模块找不到、引用失败问题。3区分前端明文密钥使用场景理解物联网平台鉴权的安全风险。四、知识准备1.OneNet Token 鉴权规则OneNet新版 HTTP 接口采用 HmacSHA1 Base64 方式生成鉴权 Token规则如下1获取平台分配的 Master-APIkey产品密钥、设备 ID2生成秒级时间戳 timestamp 与随机数 nonce3按照 设备ID 时间戳 随机数 规则拼接原始字符串4使用 APIkey 作为密钥对拼接字符串进行 HmacSHA1 哈希加密5将加密结果进行 Base64 编码最终字符串即为接口鉴权 Token6网络请求时将 Token 放入请求头 authorization 字段完成身份校验。2.crypto-js 加密库介绍crypto-js 是纯 JavaScript 实现的通用加密算法库无需额外编译可直接在微信小程序中运行。本任务主要使用其两大功能HmacSHA1实现哈希消息加密满足 OneNet 签名要求Base64实现编码转换输出标准格式 Token。3.Node.js 与 npm 介绍Node.js 是JavaScript 运行环境自带包管理工具 npm用于快速下载、安装第三方开源库。微信小程序支持通过 npm 引入第三方 JS 库安装后需手动执行「构建 npm」操作将库转换为小程序可识别的格式。4.PowerShell 执行策略Windows 系统默认限制 PowerShell 运行脚本文件会导致 npm 命令无法执行。需要手动修改执行策略放开脚本运行权限才能正常使用 npm 安装命令。5.小程序模块引用规则小程序支持自定义 JS 工具文件通过 require(文件路径) 引入外部方法。key.js 作为独立工具模块专门封装 Token 生成逻辑对外暴露公共函数实现功能解耦。6.文件目录分配项目根目录存放 key.js 工具文件构建后自动生成miniprogram_npm 文件夹存放 crypto-js 库业务页面pages/index/index.js调用工具生成 Token。五、任务实现任务 1.1 安装 crypto-js 库1.安装Node.js2.用管理员身份改PowerShell策略1WinS 搜PowerShell2右键 → 以管理员身份运行一定要管理员如图1所示。图1以管理员身份运行PowerShell3粘贴下面命令回车再输入Y确认Set-ExecutionPolicy RemoteSigned -Scope CurrentUser4关闭这个窗口重新开一个普通 PowerShell再输npm-v能出版本号就好了如图2所示。图2 设置PowerShell执行权限3.安装crypto-js库在微信开发者工具的终端中运行安装命令如图3所示npm install crypto-js图3安装crypto-js库4.构建npm顶部菜单→工具→构建npm构建成功后会出现miniprogram_npm文件夹里面应该包含crypto-js目录。5.将key.js文件拷贝到项目根目录。任务 1.2 修改基础交互逻辑文件pages/index/index.js// pages/index/index.jsconst { createCommonToken } require(../../key.js);Page({data: {// 传感器数据temp: ,humi: ,light: ,// 设备状态ledStatus: false,fanStatus: false,// 时间nowDate: ,nowTime: ,// 鉴权与定时器token: ,timeInterval: null},onLoad() {// 生成鉴权Tokenconst params {author_key: hkjx0fumJ77GvWa2VU8SNM28uii7KRuszCzGMBVK1/MdprEje4csrjcRNMMN1D,version: 2022-05-01,user_id: 460603,};this.setData({token: createCommonToken(params),});// 控制台打印 Tokenconsole.log(当前鉴权Token, this.data.token);// 只初始化一次时间不开启定时器this.setNowTime();},onShow() {this.timeInterval setInterval(() {this.setNowTime();}, 1000);},onUnload() {clearInterval(this.timeInterval);},setNowTime() {const d new Date();let y d.getFullYear();let m d.getMonth() 1;let day d.getDate();let h d.getHours();let mi d.getMinutes();let s d.getSeconds();// 星期数组const weekArr [星期日, 星期一, 星期二, 星期三, 星期四, 星期五, 星期六];let week weekArr[d.getDay()];// 数字补零m m 10 ? 0 m : m;day day 10 ? 0 day : day;h h 10 ? 0 h : h;mi mi 10 ? 0 mi : mi;s s 10 ? 0 s : s;this.setData({nowDate: ${y}年${m}月${day}日 ${week},nowTime: ${h}:${mi}:${s}})},ledOn() {wx.showToast({ title: LED已开启, icon: success })},ledOff() {wx.showToast({ title: LED已关闭, icon: success })},fanOn() {wx.showToast({ title: 风扇已开启, icon: success })},fanOff() {wx.showToast({ title: 风扇已关闭, icon: success })}})代码中author_key和 user_id的值从onenet平台获取如图4所示。图4获取author_key和 user_id的值任务 1.3 运行与结果验证1.点击开发者工具“编译”按钮运行小程序。2.打开调试器切换至Console控制台。3.控制台正常输出一串Base64 格式字符串如图4所示说明Token生成成功。图5Console 控制台输出Token