文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

小程序开发怎么实现token统一管理

2023-06-08 06:15

关注

这篇文章主要讲解了“小程序开发怎么实现token统一管理”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“小程序开发怎么实现token统一管理”吧!

TOKEN 定时刷新器

一、背景

对于使用过公众平台的API功能的开发者来说,access_token绝对不会陌生,它就像一个打开家门的钥匙,只要拿着它,就能使用公众平台绝大部分的API功能。因此,对于开发者而言,access_token的使用方式就变得尤其的重要。在日常API接口的运营中,经常遇到各种的疑问:为什么我的access_token突然非法了?为什么刚刚拿到的access_token,用了10min就过期了?对于这些疑问,我们提供出access_token的设计方案,便于开发者对access_token使用方式上的理解。

二、access_token的内部设计

2.1 access_token的时效性

众所周知,access_token是通过appid和appsecret来生成的。内部设计的步骤如下:

(1)开发者通过https请求方式: GET https://API.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET,传入appid及apppsecret的参数

(2)公众平台后台会校验appid和哈希(appsecret)是否与存储匹配,若匹配,结合当前时间戳,生成新的access_token。

(3)生成新的access_token的同时,会对老的access_token的过期时间戳更新为当前时间戳。

(4)返回新的access_token给开发者。

这里以图示的方式说明一下,新旧token交替过程:

小程序开发怎么实现token统一管理

从上图需要注意的几点:

(1)公众平台存储层只会存储新老两个access_token,意味着假设开发者重复调用3次接口,则会导致最早的access_token立刻失效。

(2)虽然请求新的access_token后,老的access_token过期时间会更新为当前时间,但也不会立刻失效,原理请参考 【2.2 access_token 的逐渐失效性】

(3)出于信息安全考虑,公众平台并不会明文存储appsecret,仅存储appid以及appsecret的哈希值。因此开发者要妥善保管appsecret。当appsecret疑似泄露时,需要及时登录mp.weixin.qq.com重置appsecret。

2.2 access_token 的逐渐失效性

从【access_token的时效性】了解到,当开发者请求获取新的access_token时,老的access_token过期时间会被更新为当前时间,但此时不会立刻失效,因为公众平台会提供【5分钟的新老access_token交替缓冲时间】,因此也称为access_token

的逐渐失效性。

实现的原理是:

小程序开发怎么实现token统一管理

从上图需要注意的几点:

(1)由于存在设备时间同步的差异,可能会导致开发者遇到拿着老的access_token请求API接口,部分请求成功,部分请求失败的情况,建议开发者获取到新的access_token后尽快使用。

(2)通过理解两个图示,对开发者来说,access_token是相当关键且不能乱调的接口,建议开发者统一管理access_token,以免造成多次请求导致access_token失效。

三、access_token的统一管理

access_token的更新交给定时触发器完成所有用到access_token的接口调用,不传入access_token,交由后端从数据库中读取

下面以小程序云函数端统一管理access_token代码为例展示

index.js 请求并更新access_token

如果在其他端,需要传入APPID

const cloud = require("wx-server-sdk")cloud.init({  env: cloud.DYNAMIC_CURRENT_ENV})const timeutil = require("./timeutil");// 需要修改的配置项const APPSECRET =  ""const axios = require("axios");const db = cloud.database();// 定时刷新获取配置信息const CONFIG = "cloud-token";// 获取TOKENconst URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={APPID}&secret={APPSECRET}"function getAccessToken(APPID,APPSECRET){  let url = URL;  url = url.replace("{APPID}",APPID)  url = url.replace("{APPSECRET}",APPSECRET)  return new Promise(function(resolve,reject){    axios.get(url).then(function (response) {      console.log(response);      resolve(response)    })    .catch(function (error) {      console.log(error);      reject(error)    });  })}// 云函数入口函数exports.main = async (event, context) => {  const wxContext = cloud.getWXContext()  // 自动获取当前应用APPID  var APPID = wxContext.APPID;  return new Promise(function(resolve,reject){    getAccessToken(APPID,APPSECRET).then(async res=>{      console.log(res)      let access_token = res.data.access_token;      let ans =  await db.collection(CONFIG).doc("access_token").set({        data:{          value:access_token,          _updateTime:timeutil.TimeCode()        }      })      resolve(ans)    })  }) }

config.json 定时触发器

每小时触发一次

{  "triggers": [    {      "name": "myTrigger",      "type": "timer",      "config": "0 0 * * * * *"    }  ]}

timeutil.js 时间工具类

function TimeCode() {  var date = new Date();  var year = date.getFullYear()  var month = date.getMonth() + 1  var day = date.getDate()  var hour = date.getHours()  var minute = date.getMinutes()  var second = date.getSeconds()  return [year, month, day].map(formatNumber).join("-") + " " + [hour, minute, second].map(formatNumber).join(":")}//获取日期function _formatTime(time) {  var date = time.getFullYear() + "年" + time.getMonth() + "月" + time.getDate() + "日"  var ftime = time.getHours() + "时" + time.getMinutes() + "分" + time.getSeconds() + "秒"  return date + ftime;}function TimeCodeYmd(){  var date = new Date();  var year = date.getFullYear()  var month = date.getMonth() + 1  var day = date.getDate()  return [year, month, day].map(formatNumber).join("-");}function formatNumber(n) {  n = n.toString()  return n[1] ? n : "0" + n}module.exports={  TimeCode,  TimeCodeYmd}

其他云函数中使用到access_token的地方,通过查询数据库进行获取,二者通过数据库进行逻辑耦合。

access_token 查询使用

const TOKEN = "cloud-token";//获取access_token   try {    let tres = await db.collection(TOKEN).doc("access_token").get();    access_token = tres.data.value;    console.log(access_token)  } catch (error) {    console.log("--无token记录--")    return {      errCode:-1,      errMsg:"数据库中无TOKEN信息"    }  }

感谢各位的阅读,以上就是“小程序开发怎么实现token统一管理”的内容了,经过本文的学习后,相信大家对小程序开发怎么实现token统一管理这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯